标签:
桥接模式就是将抽象部分和它的实现部分分离,使它们都可以独立地变化。抽象与它的实现分离,实现是指抽象类和它的派生类用来实现自己的对象。就手机而言,手机既可以用品牌来分类,也可以以功能来分类。
在面向对象设计中,我们有一个很重要的原则:合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。
对象的继承关系是在编译时就已经定好了,所以无法再运行时改变从父类继承发生的变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。
例如做一部能够使用的手机,分为硬件部分和软件部分,它们组合起来才能够成为一部手机,如果我们可以让软件和硬件(或者说不通型号的手机)的耦合度分离,那么久可以大大减少面对新需求时改动过大的不合理情况,现在可以把“手机品牌”和“手机软件”抽象出来,让不同的品牌和功能分别继承它们,这样增加新的品牌或新的功能都不会影响到其他类了。
namespace 桥接模式 { class Program { static void Main(string[] args) { HandsetBrand ab; ab = new HandsetBrandN(); ab.SetHandsetSoft(new HandsetGame()); ab.Run(); ab.SetHandsetSoft(new HandsetAddressList()); ab.Run(); ab = new HandsetBrandM(); ab.SetHandsetSoft(new HandsetGame()); ab.Run(); ab.SetHandsetSoft(new HandsetAddressList()); ab.Run(); Console.Read(); } } //手机品牌 abstract class HandsetBrand { protected HandsetSoft soft; //设置手机软件 public void SetHandsetSoft(HandsetSoft soft) { this.soft = soft; } //运行 public abstract void Run(); } //手机品牌N class HandsetBrandN : HandsetBrand { public override void Run() { soft.Run(); } } //手机品牌M class HandsetBrandM : HandsetBrand { public override void Run() { soft.Run(); } } //手机品牌S class HandsetBrandS : HandsetBrand { public override void Run() { soft.Run(); } } //手机软件 abstract class HandsetSoft { public abstract void Run(); } //手机游戏 class HandsetGame : HandsetSoft { public override void Run() { Console.WriteLine("运行手机游戏"); } } //手机通讯录 class HandsetAddressList : HandsetSoft { public override void Run() { Console.WriteLine("运行手机通讯录"); } } //手机MP3播放 class HandsetMP3 : HandsetSoft { public override void Run() { Console.WriteLine("运行手机MP3播放"); } } }
实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合度。
标签:
原文地址:http://www.cnblogs.com/kesimin/p/4836307.html