桥接模式 - 设计模式学习
合成/聚合复用原则(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音乐播放功能时,只需要添加一个类,而需要添加一个手机品牌时,也只是需要添加一个类。
桥接模式 - 设计模式学习相关推荐
- 外观模式 - 设计模式学习
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功 ...
- Facade模式——设计模式学习笔记
Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...
- 设计模式学习笔记清单
设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累. ...
- 设计模式学习笔记汇总目录
这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...
- Java设计模式学习 - 模版方法模式策略模式
个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...
- 桥接模式Bridge
简介 Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstract ...
- 设计模式学习笔记——桥接(Bridge)模式
设计模式学习笔记--桥接(Bridge)模式 @(设计模式)[设计模式, 桥接模式, bridge] 设计模式学习笔记桥接Bridge模式 基本介绍 类的功能层次结构 类的实现层次结构 使用桥接模式的 ...
- 跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...
- java/android 设计模式学习笔记(8)---桥接模式
这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...
最新文章
- Ubuntu16.04 搭建nexus 私服 学习步骤以及安装maven和git
- Linux操作系统下/etc/hosts文件配置方法
- git丢弃本地修改的所有文件(新增、删除、修改)
- C++ 学习笔记之——输入和输出
- winform-日记
- Could NOT find SDL_image (missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)
- 工作不能混日子,给自己留言
- Android学习系列(41)--Android Studio简单使用
- 构建之法第4.17章读书笔记
- 后端同同不肯给我算好的时间差给我,只好自己写了:
- es的query及filter 1
- php array函数 array_slice截取数组
- Servlet(四):转发与重定向、路径问题
- 迅为4412开发板上的步进电机小知识
- 如何解决浏览器被网站劫持
- 计算机组成原理练习题(第6章 计算机的运算方法(中))
- E - Alarm Clock (尺取法)
- ebay注册流程_2018eBay注册开店流程?
- 网站转化率与漏斗模型
- matlab:plot线型和颜色