网站大量收购闲置独家精品文档,联系QQ:2885784924

第九章 结构型设计模式.ppt

  1. 1、本文档共104页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章 结构型设计模式

第九章 结构型设计模式 目录 6.1 适配器模式 6.2 装饰模式 6.3 桥接模式 6.4 享元模式 6.5 外观模式 6.6 代理模式 6.7 组合模式 6.1 适配器(Adapter)模式 一.适配器模式的由来 二.适配器模式的意图和适用性 三.适配器模式结构及参与者 四.应用举例 五.效果分析 6.1.1 适配器模式的由来 Adapter模式解决的问题在生活中经常会遇到:比如我们有一个team为外界提供S类服务,但是我们team里面没有能够完成此项任务的member,然后我们得知有A可以完成这项服务。为了保证我们对外的服务类别的一致性(提供S服务),我们有以下两种方式解决这个问题: 1)把A直接招安到我们team为我们工作,提供S服务的时候让A去办就是了; 2)A可能在别的地方有工作,并且不准备接受我们的招安,于是我们team可以想这样一种方式解决问题:我们安排B去完成这项任务,并让B做好A的工作,让B工作的时候可以向A请教,因此B就是一个复合体(提供S服务,但是是A的继承弟子)。 6.1.1 适配器模式的由来 Adapter模式用途 实际上在软件系统设计和开发中,这种问题会经常遇到:我们为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题:我们在应用程序中已经设计好了功能接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作,Adapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。 6.1.2 适配器模式意图和适用性 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 6.1.2 适配器模式意图和适用性 你想使用一个已经存在的类,而它的接口不符合你的要求。 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。 (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。 适配器模式分为类模式适配器和对象模式适配器。 6.1.3 适配器模式意图和适用性 类适配器和对象适配器有不同的权衡。类适配器 用一个具体的adapter类对adapater和target进行匹配。结果是当我们想要匹配一个类及以及所有它的子类时,类adapter将不能胜任工作。 使得adapter可以重定义adaptee的部分行为,因为adapter时adaptee的一个子类。 仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。 对象适配器则 允许一个adapter与多个adaptee(即adaptee本身以及它的所有子类)同时工作。Adapter也可以一次给所有的adaptee添加功能。 使得重定义adaptee的行为比较困难。这就需要生成adaptee的子类并且使得adapter引用这个子类而不是引用adapter本身。 class Target { public: virtual void Request(); }; class Adaptee { public: void SpecificRequest(); }; class Adapter:public Target,private Adaptee//同时继承Target和Adapatee { public: void Request(); }; void Adapter::Request() { this-SpecificRequest(); //通过继承实现Adaptee的方法SpecificRequest () } class Target { public: virtual void Request(); }; class Adaptee { public: void SpecificRequest(); }; class Adapter:public Target { public: Adapter(Adaptee* ade); //产生一个Adaptee对象 ~Adapter(); void Request(); private: Adaptee* _ade; }; Adapter::Adapter(Adaptee* ade) { this-_ade = ade; //传递Adaptee对象到Adapter } void Adapter::Request() { _ade-

您可能关注的文档

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档