[设计模式笔记]二. 结构型模式总结

AdapterBridge

         结构型模式之间有很多相似之处(例如在很多结构型模式中都有一个相似性就是都是包含了一个对象的引用或者实体用户不直接调用对象而是过这些模式中的对应类间接调用对象通过这样的间接调用在调用对象的方法前后可以做一些事情.(当然不做也可以虽然他们的目的是不一样的.)尤其是它们的参与者和协作之间的相似性这可能是因为结构型模式依赖于同一个很小的语言机制集合构造代码和对象单继承和多重继承机制用于基于类的模式而对象组合机制用于对象式模式但是这些相似性掩盖了这些模式的不同意图.

         Adapter模式和Bridge模式具有一些共同的特征它们都给另一对象提供了一定程度上的间接性因而有利于系统的灵活性它们都涉及到从自身以外的一个接口向这个对象转发请求

         这些模式的不同之处主要在于它们各自的用途. Adapter模式主要是为了解决两个已有接口之间不匹配的问题它不考虑这些接口是怎样实现的也不考虑它们各自可能会如何演化这种方式不需要对两个独立设计的类中的任一个进行重新设计就能够使它们协同工作.

         另一方面, Bridge模式则对抽象接口与它的(可能是多个)实现部分进行桥接虽然这一模式允许你修改实现它的类它仍然为用户提供了一个稳定的接口. Bridge模式也会在系统演化时适应新的实现.

         由于这些不同点AdapterBridge模式通常被用于软件生命周期的不同阶段当你发现两个不兼容的类必须同时工作时就有必要使用Adapter模式其目的一般是为了避免代码重复此处耦合不可预见相反, Bridge的使用者必须事先知道一个抽象将有多个实现部分并且抽象和实现两者是独立演化的. Adapter模式在类已经设计好后实施:Bridge模式在设计类之前实施这并不意味着Adapter模式不如Bridge模式只是因为它们针对了不同的问题.

         你可能认为Fracade模式是另外一组对象的适配器但这种解释忽视了一个事实Facade定义一个新的接口Adapter则复用一个原有的接口记住适配器使两个已有的接口协同工作而不是定义一个全新的接口.


图1. Adapter模式(对象组合方式实现)



图2. Bridge模式



图3. Facade模式

Composite, DecoratorProxy


         Composite(组合)模式和Decorator(包装)模式具有类似的结构图这说明它们都基于递归组合来组织可变数目的对象这一共同点可能会使你认为Decorator对象是一个退化的composite, 但这一观点没有领会Decorator模式要点相似点仅止于递归组合同样这是因为这两个模式的目的不同. Decorator 旨在使你能够不需要生成子类即可给对象添加职责这就避免了静态实现所有功能组合从而导致子类急剧增加Composite则有不同的目的它旨在构造类使多个相关的对象能够以统一的方式处理而多重对象可以被当作一个对象来处理. 它重点不在于修饰而在于表示.

         尽管它们的目的截然不同但却具有互补性因此CompositeDecorator模式通常协同使用在使用这两种模式进行设计时我们无需定义新的类仅需将一些对象插接在一起即可构建应用这时系统中将会有一个抽象类它有一些composite子类和decorator子类还有一些实现系统的基本构建模块此时, compositesdecorator将拥有共同的接口Decorator模式的角度看, composite是一个ConcreteComponent. 而从composite模式的角度看, decorator则是一个Leaf. 当然他们不一定要同时使用正如我们所见它们的目的有很大的差别(把各个模式有机结合的使用而不是独立使用独立分析).

         另一种与Decorator模式结构相似的模式是Proxy. 这两种模式都描述了怎样为对象提供一定程度上的间接引用proxydecorator对象的实现部分都保留了指向另一个对象的指针它们向这个对象发送请求然而同样它们具有不同的设计目的Decorator模式一样, Proxy模式构成一个对象并为用户提供一致的接口但与Decorator模式不同的是, Proxy模式不能动态地添加或分离性质它也不是为递归组合而设计的它的目的是当直接访问一个实体不方便或不符合需要时为这个实体提供一个替代者例如实体在远程设备上访问受到限制或者实体是持久存储的.

         Proxy模式中实体定义了关键功能Proxy提供(或拒绝)对它的访问.Decorator模式中组件仅提供了部分功能而一个或多个Decorator负责完成其他功能Decorator模式适用于编译时不能(至少不方便)确定对象的全部功能的情况这种开放性使递归组合成为Decorator模式中一个必不可少的部分而在Proxy模式中则不是这样因为Proxy模式强调一种关系(Proxy与它的实体之间的关系), 这种关系可以静态的表达模式间的这些差异非常重要因为它们针对了面向对象设计过程中一些特定的经常发生问题的解决方法. 但这并不意味着这些模式不能结合使用可以设想有一个proxy-decorator, 它可以给proxy添加功能或是一个decorator-proxy用来修饰一个远程对象尽管这种混合可能有用(我们手边还没有现成的例子), 但它们可以分割成一些有用的模式.

图4. Composite(组合)模式



5. Decorator(装饰)模式



6. Proxy(代理)模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值