合成/聚合复用原则(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();}//手机品牌Nclass HandsetBrandN : HandsetBrand{public override void Run(){soft.Run();}}//手机品牌Mclass 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音乐播放功能时,只需要添加一个类,而需要添加一个手机品牌时,也只是需要添加一个类。

桥接模式 - 设计模式学习相关推荐

  1. 外观模式 - 设计模式学习

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功 ...

  2. Facade模式——设计模式学习笔记

    Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...

  3. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  4. 设计模式学习笔记汇总目录

    这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...

  5. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  6. 桥接模式Bridge

    简介 Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstract ...

  7. 设计模式学习笔记——桥接(Bridge)模式

    设计模式学习笔记--桥接(Bridge)模式 @(设计模式)[设计模式, 桥接模式, bridge] 设计模式学习笔记桥接Bridge模式 基本介绍 类的功能层次结构 类的实现层次结构 使用桥接模式的 ...

  8. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  9. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

最新文章

  1. Ubuntu16.04 搭建nexus 私服 学习步骤以及安装maven和git
  2. Linux操作系统下/etc/hosts文件配置方法
  3. git丢弃本地修改的所有文件(新增、删除、修改)
  4. C++ 学习笔记之——输入和输出
  5. winform-日记
  6. Could NOT find SDL_image (missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)
  7. 工作不能混日子,给自己留言
  8. Android学习系列(41)--Android Studio简单使用
  9. 构建之法第4.17章读书笔记
  10. 后端同同不肯给我算好的时间差给我,只好自己写了:
  11. es的query及filter 1
  12. php array函数 array_slice截取数组
  13. Servlet(四):转发与重定向、路径问题
  14. 迅为4412开发板上的步进电机小知识
  15. 如何解决浏览器被网站劫持
  16. 计算机组成原理练习题(第6章 计算机的运算方法(中))
  17. E - Alarm Clock (尺取法)
  18. ebay注册流程_2018eBay注册开店流程?
  19. 网站转化率与漏斗模型
  20. matlab:plot线型和颜色

热门文章

  1. 情爱难剪断,菩提树下悟佛缘
  2. c#没有指针导致的性能问题研究一二
  3. GARFIELD@09-11-2004
  4. 条件运算符和条件表达式
  5. 小熊的人生回忆(五)
  6. Intellij Idea插件利器推荐大全
  7. mysql几种安装方法_mysql的三种安装方式(详细)
  8. 洛谷P1073 最优贸易
  9. 通过手机物理返回键实现弹出层的隐藏
  10. 【Linux】使用du、df 和 sort 命令快速找出Linux系统中的大文件