博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
桥接模式 - 设计模式学习
阅读量:7210 次
发布时间:2019-06-29

本文共 3636 字,大约阅读时间需要 12 分钟。

  合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。

  合成和聚合都是关联的特殊种类。聚合表示一种弱的“拥有关系”,体现的是A对象可以包含B对象,但B对象不一定是A对象的一部分;合成则是一种枪的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样。比方说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且它们的声明周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。

  合成/聚合复用原则的好处是,有限使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

  桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。桥接模式主要讲的是尽量用聚合,而不要盲目使用继承。

  下面给出桥接模式的UML图:

    

  桥接模式的基本代码结构:

namespace ConsoleApplication1{    abstract class Implementor    {        public abstract void Operation();    }    class ConcreteImplementorA : Implementor    {        public override void Operation()        {            Console.WriteLine("具体实现A的方法执行");        }    }    class ConcreteImplementorB : Implementor    {        public override void Operation()        {            Console.WriteLine("具体实现B的方法执行");        }    }    class Abstraction    {        protected Implementor implementor;        public void SetImplementor(Implementor implementor)        {            this.implementor = implementor;        }        public virtual void Operation()        {            implementor.Operation();        }    }    class RefinedAbstraction : Abstraction     {        public override void Operation()        {            implementor.Operation();        }    }    class Program    {        static void Main(string[] args)        {            Abstraction ab = new RefinedAbstraction();            ab.SetImplementor(new ConcreteImplementorA());            ab.Operation();            ab.SetImplementor(new ConcreteImplementorB());            ab.Operation();            Console.ReadKey();        }    }  }

  结果:

  

   实现系统可能有多角度分类,每一种分那么类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

   其实只要真正了解设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了。

   现在回到《大话设计模式》中的手机品牌与软件的例子

namespace ConsoleApplication1{    //手机软件抽象类    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    class HandsetBrandN : HandsetBrand    {        public override void Run()        {            soft.Run();        }    }    //手机品牌M    class HandsetBrandM : HandsetBrand    {        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.ReadKey();        }    }  }

  这样写的好处非常好,如果现在要增加一个功能,例如MP3音乐播放功能,那么只要增加一个MP3音乐播放类就可以了。

  在《大话设计模式》中有一个用继承的写法,现在放上它的类图:

  

  在这种用继承的方法,就增加一个MP3音乐播放功能,那就需要在每个品牌下添加一个MP3音乐播放类,如果需要再添加一个手机品牌,也有通讯录,游戏,MP3播放器功能,那就需要添加相当多的类,崩溃。

  但是上面的桥接模式的类图:

  

  手机品牌与手机软件之间是聚合关系,当需要添加一个MP3音乐播放功能时,只需要添加一个类,而需要添加一个手机品牌时,也只是需要添加一个类。

转载地址:http://ureum.baihongyu.com/

你可能感兴趣的文章
基准测试工具
查看>>
遇到的几个开机启动故障
查看>>
NEC向格鲁吉亚提供基于面部识别技术的城市监控系统
查看>>
linux网络编程之-----基础理论篇
查看>>
加大Linux服务器的文件描述符
查看>>
Linux内核编译过程详解
查看>>
shell监控web服务的多种方案
查看>>
微信小程序--亲戚称呼计算
查看>>
Broker模块划分
查看>>
常用URL地址
查看>>
修改centos系统默认编辑器
查看>>
Linux 2 unit7 挂载网络共享
查看>>
搭建cacti
查看>>
FPGA设计——CMOS摄像与HDMI显示(DVP版)
查看>>
git分支建立删除,打tag
查看>>
mac地址规范及算法
查看>>
#10 Linux硬盘管理
查看>>
实战操作主机角色转移(二)
查看>>
MySQL数据库基本操作
查看>>
我写的oracleRAC状态监控脚本(在单位一直使用,比较稳定)
查看>>