无废话C#设计模式之十二:Bridge

2016-02-19 13:46 2 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的无废话C#设计模式之十二:Bridge,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  本系列文章将向大家介绍一下C#的设计模式,此为第十二篇文章,相信对大家会有所帮助的。废话不多说,继续来看。

  意图

  将抽象部分与实现部分分离,使它们都可以独立的变化。

  场景

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现在的问题就是,不仅仅是游戏场景会不断扩充,而且游戏的模式也在不断扩充。比如,除了最基本的战斗模式之外,还会有道具模式,金币模式等。

  对于这种在多个维度上都会有变化或扩充需求的项目来说,可以考虑引入桥接模式。或许你会说,不管是什么场景,不管什么模式,都可以是抽象场景的一个子类,但是,如果这样的话,4个场景和3种模式就会产生12个子类,而10个场景5种模式就会有50个子类。一味进行继承并不是什么好方法,桥接模式的思想是把继承转化为组合,把乘法(10*5=50)转化为加法(10+5=15)。

  示例代码

以下是引用片段:
  using System;
  using System.Collections.Generic;
  using System.Text;
  namespace BridgeExample
  {
  class Program
  {
  static void Main(string[] args)
  {
  PatrixScene halfPaper = new HalfPaper();
  halfPaper.Mode = new GoldMode();
  halfPaper.LoadScene();
  PatrixScene matrix = new Matrix();
  matrix.Mode = new PrpoertyMode();
  matrix.LoadScene();
  }
  }
  abstract class PatrixScene
  {
  protected GameMode mode;
  public GameMode Mode
  {
  get { return mode; }
  set { mode = value; }
  }
  public abstract void LoadScene();
  }
  class HalfPaper : PatrixScene
  {
  public override void LoadScene()
  {
  Console.WriteLine("Load HalfPaper Completed");
  mode.InitScene();
  }
  }
  class Matrix : PatrixScene
  {
  public override void LoadScene()
  {
  Console.WriteLine("Load Matrix Completed");
  mode.InitScene();
  }
  }
  abstract class GameMode
  {
  public abstract void InitScene();
  }
  class PrpoertyMode : GameMode
  {
  public override void InitScene()
  {
  Console.WriteLine("Init Property Mode Completed");
  }
  }
  class GoldMode : GameMode
  {
  public override void InitScene()
  {
  Console.WriteLine("Init Gold Mode Completed");
  }
  }
  }

  代码执行结果如下图:

  

  代码说明

  PatrixScene类是抽象化角色。虽然说针对第一维度也就是游戏场景,PatrixScene也是一个抽象,但是我觉得这里说的抽象化和实现化还是针对第二维度的,也就是游戏模式。

  GameMode类就是实现化角色。你或许会说对于多个维度,把哪个作为抽象化角色呢?虽然维度是一个平行的概念,但是对于Bridge模式来说,我觉得它是把相对高层的角色作为抽象化角色,而把比较底层的操作作为实现化角色的。比如,对于场景和模式来说,模式是为场景服务的,我们就把场景作为抽象化角色。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  HalfPaper和Matrix都是修正抽象化角色。按照GOF的定义是说修正父类的抽象化定义。其实,我觉得抽象化角色不一定必须是对方法有默认实现,并且由子类进行修正。

  PropertyMode和GoldMode是具体实现化角色。它们用来实现实现化角色定义的接口。

  从一个角度来说,抽象化和修正抽象化角色相对应实现化和具体实现化角色,从另外一个角度来说,抽象化和实现化角色对应修正抽象化和具体实现化角色。

  客户端代码中直接选择合适的具体实现化角色。看到这里,你可能觉得和策略模式很像。其实,策略模式针对面更小一点,一是针对算法替换,二是只针对一个维度的变化点,因此它也就只有一个抽象角色。

  何时采用

  从代码角度来说,如果类型的继承是处于2个目的(违背单一职责原则)的话可以使用Bridge模式避免过多的子类。

  从应用角度来说, 如果应用会在多个维度上进行变化,客户端希望两个维度(场景、游戏模式)的对象相对独立,动态耦合(客户端决定哪个场景和哪个游戏模式耦合)的时候可以考虑Bridge模式。

  实现要点

  选择合适的类型作为抽象化角色(第一维度)。

  抽象化角色和实现化角色通过组合进行关联。

  抽象和实现不绑定,允许客户端作切换。

上一篇:无废话C#设计模式之十一:Composite
下一篇:无废话C#设计模式之十三:Decorator

  本系列文章将向大家介绍一下C#的设计模式,此为第十二篇文章,相信对大家会有所帮助的。废话不多说,继续来看。

  意图

  将抽象部分与实现部分分离,使它们都可以独立的变化。

  场景

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现在的问题就是,不仅仅是游戏场景会不断扩充,而且游戏的模式也在不断扩充。比如,除了最基本的战斗模式之外,还会有道具模式,金币模式等。

  对于这种在多个维度上都会有变化或扩充需求的项目来说,可以考虑引入桥接模式。或许你会说,不管是什么场景,不管什么模式,都可以是抽象场景的一个子类,但是,如果这样的话,4个场景和3种模式就会产生12个子类,而10个场景5种模式就会有50个子类。一味进行继承并不是什么好方法,桥接模式的思想是把继承转化为组合,把乘法(10*5=50)转化为加法(10+5=15)。

  示例代码

以下是引用片段:
  using System;
  using System.Collections.Generic;
  using System.Text;
  namespace BridgeExample
  {
  class Program
  {
  static void Main(string[] args)
  {
  PatrixScene halfPaper = new HalfPaper();
  halfPaper.Mode = new GoldMode();
  halfPaper.LoadScene();
  PatrixScene matrix = new Matrix();
  matrix.Mode = new PrpoertyMode();
  matrix.LoadScene();
  }
  }
  abstract class PatrixScene
  {
  protected GameMode mode;
  public GameMode Mode
  {
  get { return mode; }
  set { mode = value; }
  }
  public abstract void LoadScene();
  }
  class HalfPaper : PatrixScene
  {
  public override void LoadScene()
  {
  Console.WriteLine("Load HalfPaper Completed");
  mode.InitScene();
  }
  }
  class Matrix : PatrixScene
  {
  public override void LoadScene()
  {
  Console.WriteLine("Load Matrix Completed");
  mode.InitScene();
  }
  }
  abstract class GameMode
  {
  public abstract void InitScene();
  }
  class PrpoertyMode : GameMode
  {
  public override void InitScene()
  {
  Console.WriteLine("Init Property Mode Completed");
  }
  }
  class GoldMode : GameMode
  {
  public override void InitScene()
  {
  Console.WriteLine("Init Gold Mode Completed");
  }
  }
  }

来源:http://www.tulaoshi.com/n/20160219/1605177.html

延伸阅读
从重构的角度学习bridge设计模式 Bridge模式是一个在实际系统中经常应用的模式。它最能体现设计模式的原则针对接口进行编程,和使用聚合不使用继续这两个原则。 !-- frame contents -- !-- /frame contents -- 由于我们过分的使用继续,使类的结构过于复杂,不易理解,难以维护。非凡是在Java中由于不能同时继续多个类,...
C#中程序结构的关键概念为程序、命名空间、类型、成员和程序集。C#程序包括一个或多个源文件。程序中声明类型,类型包含成员并能够被组织到命名空间中。类和接口是类型的例子。字段、方法、属性和事件则是成员的例子。当C#程序被编译时,它们被物理地打包到程序集中。程序集的文件扩展名一般为.exe或者.dll,这取决于它们是实现为应用程序...
本文目的:根据近期开发的C#软件,对于软件的启动设计谈谈我的心得。 如下代码是我设计的启动软件的类,应用程序入口也是在这个普通类里面。 using System; using System.Threading; using System.Windows.Forms; namespace MainClass { public class MainApp { private static Mutex myMutex; private static bool requestInitialOwnersh...
面向对象思想有三个核心要素:封装、继承与多态。如能正确理解这三要素,那么基本上可以算是在编程中建立了面向对象思想。在第二节中我曾介绍,在C#中,所有数据类型的实例都是对象,不过最能体现对象特质的类型,还是类,同时它也是C#中最重要、最频繁使用的类型。接下来,我将通过介绍C#的类,来充分理解对象封装的概念。 所谓对象...
C#是纯粹的面向对象编程语言,它真正体现了一切皆为对象的精神。在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object类型。此外,使用C#编程,不会存在与游离于对象之外的属于过程的东西。因此,学习C#,就必须具有面向对象思想,不明白所谓的面向对象思想,就不可能掌握C#的精髓,而对于C#的理解,就只能仅限...

经验教程

596

收藏

18
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部