设计模式.桥接模式(Bridge).pptx_第1页
设计模式.桥接模式(Bridge).pptx_第2页
设计模式.桥接模式(Bridge).pptx_第3页
设计模式.桥接模式(Bridge).pptx_第4页
设计模式.桥接模式(Bridge).pptx_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式 DesignPattern 张凯副教授计算机学院软件工程系 问题 Problem 凭什么你的手机游戏我不能玩M品牌手机的游戏 N品牌不能玩不同品牌手机操作系统不同 软件不通用用程序模拟 N品牌手机 有一个游戏 运行游戏的程序如何写 问题 Problem staticvoidMain string args MobilePhoneNGamegame newMobilePhoneNGame game Run Console Read classMobilePhoneNGame publicvoidRun Console WriteLine 运行N品牌手机游戏 如果有一个M品牌手机 也有游戏可以运行 如何设计 问题 Problem 问题 Problem classMobilePhoneGame publicvirtualvoidRun classMobilePhoneNGame MobilePhoneGame publicoverridevoidRun Console WriteLine 运行N品牌手机游戏 classMobilePhoneMGame MobilePhoneGame publicoverridevoidRun Console WriteLine 运行M品牌手机游戏 如果M品牌和N品牌手机 都添加了通讯录怎么办 问题 Problem 如果再添加Mp3音乐播放功能 怎么修改 问题 Problem 如果再添加S品牌手机 并且有相同功能 怎么修改 问题 Problem 怎么这么麻烦 换一种方式试一下 问题 Problem 思考 为什么抽象了手机品牌 或抽象了手机软件 当需求变化时 感觉如此不稳定 违背了面向对象单一职责原则 主要内容 桥接模式 Bridge 模式动机模式名称 桥接模式 Bridge 桥接模式的用意是 将抽象化 Abstraction 与实现化 Implementation 脱耦 使得二者可以独立地变化 这句话有三个关键词抽象化实现化脱耦 桥接模式 Bridge 模式定义桥接模式 BridgePattern 将抽象部分与它的实现部分分离 使它们都可以独立地变化 它是一种对象结构型模式 又称为柄体 HandleandBody 模式或接口 Interface 模式 桥接模式 Bridge 桥接模式 Bridge 解耦变化我们需要解耦这两个方向的变化 把它们之间的强耦合关系改成弱联系 我们把手机品牌和手机软件的实现分别当作两个独立的部分来对待 桥接模式 Bridge 这时对于手机品牌和手机软件这两个类都可以独立的变化了 我们要做的工作就是把这两部分之间连接起来 那如何连接呢 Bridge使用了对象聚合的方式 像一座桥 桥接模式 Bridge abstractclassMobilePhoneSoft 手机软件 publicabstractvoidRun classMobilePhoneGame MobilePhoneSoft 手机游戏 publicoverridevoidRun Console WriteLine 运行手机游戏 classMobilePhoneAddressList MobilePhoneSoft 手机通讯录 publicoverridevoidRun Console WriteLine 运行手机通讯录 classMobilePhoneMP3 MobilePhoneSoft 手机MP3播放 publicoverridevoidRun Console WriteLine 运行手机MP3播放 桥接模式 Bridge 手机品牌abstractclassMobilePhoneBrand protectedMobilePhoneSoftsoft 设置手机软件publicvoidSetHandsetSoft MobilePhoneSoftsoft this soft soft 运行publicabstractvoidRun 手机品牌NclassMobilePhoneN MobilePhoneBrand publicoverridevoidRun soft Run 桥接模式 Bridge staticvoidMain string args MobilePhoneBrandab ab newMobilePhoneN ab SetHandsetSoft newMobilePhoneGame ab Run ab SetHandsetSoft newMobilePhoneAddressList ab Run Console Read 桥接模式 Bridge 模式结构 桥接模式 Bridge 模式结构 在桥接模式中不仅Implementor具有变化 ConcreateImplementior 而且Abstraction也可以发生变化 RefinedAbstraction 这是一个多对多的关系 而且两者的变化是完全独立的 RefinedAbstraction与ConcreateImplementior之间松散耦合 它们仅仅通过Abstraction与Implementor之间的聚合关系联系起来 桥接模式 Bridge 参与者Abstraction 抽象类RefinedAbstraction 扩充抽象类Implementor 实现类接口ConcreteImplementor 具体实现类 桥接模式 Bridge 例子考虑不同平台的日志记录 对于操作数据库 写入文本文件所调用的方式可能是不一样的 为此对于不同的日志记录方式 我们需要提供各种不同平台上的实现 对上面的类做进一步的设计得到了下面的结构图 桥接模式 Bridge 例子现在的这种设计方案本身是没有任何错误的 假如现在我们要引入一种新的xml文件的记录方式 则上面的类结构图会变成 桥接模式 Bridge 例子我们新增加了一个继承于Log基类的子类 而没有修改其它的子类 这样也符合了开放 封闭原则 如果我们引入一种新的平台 比如说我们现在开发的日志记录工具还需要支持Borland平台 此时该类结构又变成 桥接模式 Bridge 例子Bridge模式粉墨登场 我们需要解耦这两个方向的变化 把它们之间的强耦合关系改成弱联系 我们把日志记录方式和不同平台上的实现分别当作两个独立的部分来对待 桥接模式 Bridge 例子这样的设计是脆弱的 它在遵循开放 封闭原则的同时 违背了类的单一职责原则 即一个类只有一个引起它变化的原因 而这里引起Log类变化的原因却有两个 即日志记录方式的变化和日志记录平台的变化 重复代码会很多 不同的日志记录方式在不同的平台上也会有一部分的代码是相同的 再次是类的结构过于复杂 继承关系太多 难于维护 最致命的一点是扩展性太差 上面我们分析的变化只是沿着某一个方向 如果变化沿着日志记录方式和不同的运行平台两个方向变化 我们会看到这个类的结构会迅速的变庞大 桥接模式 Bridge 桥接模式的优点如下分离接口及其实现部分 桥接模式使用 对象间的组合关系 解耦了抽象和实现之间固有的绑定关系 使得抽象和实现可以沿着各自的维度来变化 所谓抽象和实现沿着各自维度的变化 即 子类化 它们 得到各个子类之后 从而获得不同平台上的不同型号 桥接模式 Bridge 桥接模式的优点如下桥接模式的应用一般在 两个非常强的变化维度 有时候即使有两个变化的维度 但是某个方向的变化维度并不剧烈 换言之两个变化不会导致纵横交错的结果 并不一定要使用桥接模式 桥接模式提高了系统的可扩充性 实现细节对客户透明 可以对用户隐藏实现细节 桥接模式 Bridge 桥接模式的优点如下桥接模式有时候类似于多继承方案 但是多继承方案往往违背了类的单一职责原则 即一个类只有一个变化的原因 复用性比较差 桥接模式是比多继承方案更好的解决方法 桥接模式 Bridge 模式使用在以下的情况下应当使用桥接模式 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性 避免在两个层次之间建立静态的联系 设计要求实现化角色的任何改变不应当影响客户端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论