设计模式—桥接模式

来源:互联网 发布:淘宝客服模板制作 编辑:程序博客网 时间:2024/06/05 10:01

········桥接模式给了我非常大的触动,为什么这么说呢?因为通过之前对面向对象的理解,就是对于能明显看出是父类和子类关系的类,我们最好都用继承的方式来进行代码的复用,以便达到面向对象的好处,但是通过今天学的这个例子,手机软件何时统一,让我又一次对面向对象的理解加深了一分。

········就拿这个例子来说,两个品牌,都有游戏,都有通讯录,按照正常思维来想的话,依据面向对象的思想,应该有一个父类“手机品牌”,下有“手机品牌M”和“手机品牌N”,每个子类下各有“通讯录”和“游戏”子类。
UML类图:
这里写图片描述

·······由上图我们可以分析出来,如果每个品牌都要增加一个MP3的功能,那么在每个品牌的手机下面都要再添加一个子类“MP3”,但是如果我们在增加一个手机品牌“S”,那么按照这中UML图所表达的就是在添加一个新的手机品牌,还要再增加该品牌的子类,这样就会出现大量的数据重复,严重的违背了面向对象的设计原则。

·······这里我知道了一种设计模式的原则,即合成/复用原则:尽量使用合成/聚合,尽量不要使用类继承。该原则的优点是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小的规模,并且不太可能增长为不可控制的庞然大物。

·······按照这种原则,那么对于这个例子来说,就是应该有个“手机品牌”抽象类和“手机软件”抽象类。让不同的品牌和功能分别继承他们,这样要增加新的品牌或新的功能都不用影响其他类了。
UML类图:
这里写图片描述

当然,手机品牌和手机软件之间是聚合关系。
下面让我们看一下代码:
手机软件抽象类

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("运行手机通讯录");    }}

手机品牌抽象类

       abstract class HandsetBrand  //手机品牌{     protected HandsetSoft soft;     //设置手机软件     public void SetHandsetSoft(HandsetSoft soft)     {         this.soft = soft;     }     //运行     public abstract void Run();}

品牌N和品牌M具体类

   class HandsetBrandM:HandsetBrand   //手机品牌M{    public override void Run()    {        soft.Run();    }}     class HandsetBrandN:HandsetBrand  //手机品牌N{    public override void Run()    {        soft.Run();    }}

客户端调用代码:

 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();    }}

总结:桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立 变化,实现指的是抽象类和它的派生类用来实现自己的对象,对于刚才的例子也就是让“手机”既可以按照品牌来分类,也可以按照功能来分类。
·······面向对象的设计还需要我们在学习设计模式的基础上活学活用,当然了,这用要在基础之上,所以前提是我们要好好的思考和研究面向对象的设计思想和设计模式的应用,才可以真正的学号设计模式。

1 0
原创粉丝点击