《设计模式04》.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三部分 结构型设计模式 桥接模式(Bridge Pattern) 适配器模式(Adpter Pattern) 合成模式(Compsite Pattern) 门面模式(Facade Pattern) 装饰模式(Decorator Pattern) 代理模式(Proxy Pattern) 享元模式(Flyweight Pattern) 3.1 桥接模式(Bridge Pattern) class A{ public: ? ? ?virtual ~A(); ? ? ?virtual void f( ); ? ? ?virtual void g( ); private: ? ? ? ?int ? ?x; ? ? ? ?int ? ?y; }; 适应单个方向的变化 容易 组合和继承方式均可 适应接口变化方法 适应实现变化方法 两个方向同时变化的适应 单一使用组合或继承的不足 结合组合和继承的方式 分离变化 用组合关联两个方向的变化 使单个方向的变化独立出来(独立变化) 例 第一步: 分离接口和实现 第二步:用组合连接接口和实现 第三步:使接口和实现的变化独立 3.1.2 效果 分离了接口及其实现 使得各部分可独立变化、扩展 可对客户隐藏实现部分 也称Handle模式/Handle-Body模式 3.1.3 结构 3.2 适配器模式(Adapter Pattern) 已有现成的两个类簇-Student和Teacher类簇; 希望创建一些新的实例-具有学生的功能,但这些功能又用到教师的功能; 例: 学生、教师 问题 接口的不一致性 原接口的不可更改性 解决方式: 类的适配器方式 对象适配器方式 类的适配器模式 对象适配器方式 3.2.2 效果 在不改变原有类的前提下,调整原有类的接口 适用性: 使用已有的类,但类的接口不符合需要; 对象适配器,通常比类适配器更灵活; 3.2.4 类适配器结构 3.2.5 对象适配器结构 3.3 合成模式(Compsite Pattern) 一个树形结构: 节点的关系表示 根节点(特殊的树枝/叶子节点) 树枝节点 叶子节点 一般化表示 子节点的管理 AddChild(),RemoveChild( ),GetChild(int),GetChildren()等只对树枝节点有意义 这些管理子节点的操作放哪个类里呢? 放Node中(透明式) 放BranchNode中(安全式) 3.3.2 透明式合成模式结构(1) 透明式合成模式结构(2) 安全式合成模式 3.3.3 例子 一个集团公司:下设多个部门,如办公室、财务处、基建处、人事处等;同时还下设多个分公司,如北京分公司、广东分公司等;各分公司,也可以下设多个部门和多个分公司,如广东分公司,可能下设财务处、投标办、广州分公司、深圳分公司、珠海分公司等。 3.4 门面模式(Facade Pattern) 一个子系统: 内部有许多类,该子系统通过这些类和它们之间的交互作用,为客户提供相应的功能。 3.4.2 结构 3.4.3 效果 对用户隐藏了系统的实现,易用; 降低了Client与子系统之间的耦合; 仍然可以直接与子系统内部交互; 适用性: 为复杂系统提供简单接口; 为多个子系统提供统一的“门面”,保持子系统的独立变化性; 便于构建层次化的系统; 3.4.4 例 DirectX: Direct3D、DirectInput、DirectMedia Facade * * 变化的三个方向: 1)接口的变化 2)实现的变化 3)属性的变化(本质上,还是实现的变化) class A { public: ? ? ?virtual ~A(); ? ? ?virtual void f( ); ? ? ?virtual void g( ); protected : ? ? ? ?int ? ?x; ? ? ? ?int ? ?y; }; class NewA:public A { public: ? ? ?virtual ~NewA( ); ? ? ?virtual void h( ); }; class NewA { public: ? ? ?NewA(A * oldA):pa(oldA) { } ? ? ?virtual ~NewA( ); ? ? ?virtual void f( ) { pa->f( ); } ? ? ?virtual void g( ) { pa->g( ); } ? ? ?virtual void h( ); private: ? ? A ? * pa; }; class A{ public: ? ? ?virtual ~A(); ? ? ?virtual void f( ); ? ? ?virtual void g( )

文档评论(0)

精品文库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档