设计模式 -- 结构型模式

涉及到如何组合类和对象以获得更大的结构

ADAPTER(适配器) –类对象结构性模式

适用性:

  • 如果想使用一个已经存在的类,然而他的接口不符合我们的需求
  • 想创建一个可以复用的类,与其他不相关的类或不可预见的类协同工作
  • (对象 adapter)使用已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配父类接口

目的是改变已经存在的接口

结构的话:

  • 类适配器就是客户端需要的一套接口,然后第三方提供了另外的接口,然后适配器就继承两个,然后在客户端需要的接口中调用第三方的接口
  • 对象匹配器居室客户端需要一套接口,然后第三方提供了另外的接口,然后适配器继承客户端,然后拥有一个第三方的实例,然后在客户端需要的接口中调用第三方的接口

效果:

  • 用一个具体的类来对 adaptee 和 target 进行匹配。但是如果我们想要匹配一个类以及他所有的子类的时候,不能胜任
  • adapter 冲定义 adaptee 的的部分行为
  • 仅仅引入了一个对象,并不需要额外的指针以间接得到 apaptee。

BRIDGE(桥接) –对象结构型模式

意图:将抽象部分与实现部分分离,使得他们都可以独立的变化

适用性:

  • 不希望在抽象与实现之间有一个固定的绑定关系。可能希望实现部分可以被选择或者切换。
  • 对用户隐藏抽象的实现部分
  • 类的抽象和他的实现都应该可以通过生成子类的方法加以扩充。

结构:

就是抽象类内部聚合了一个具体实现类的抽象,然后在内部接口调用这个具体实现类接口的实现。然后创建的时候只要 set 一下内部的具体实现类就好了。想切换的时候就重新 set 就好了。

效果:

  • 分离接口及其实现部分,实现可以在运行时进行配置,甚至动态改变。
  • 提高可扩充性
  • 实现细节对客户透明

COMPOSITE(组合) –对象结构型模式

意图:使得用户对于单个对象和组合对象的使用具有一致性

适用性:

  • 想表示对象的部分-整体层次结构
  • 希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象。

结构:

就是定义一个类,既有普通的图元所拥有的操作方法,又有作为容器的那些添加,删除,获得子孙的方法,。然后叶类继承这个类,实现基本操作,容器类继承,在内部聚合叶类。

效果:

  • 定义了包含基本对象和组合对象的类层次结构,支持不断的递归嵌套
  • 简化客户代码,不需要知道是使用组合对象还是单个对象

DECORATOR(装饰) –对象结构型模式

意图:动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更加灵活

适用性:

  • 在不影响其他对象的时候,以动态,透明的方式给单个对象添加职责
  • 处理那些可以撤销的职责
  • 当不能使用生成子类的方法进行扩展时

结构:

就是一个装饰器类,聚合真实的组件,提供与真实组件一样的接口,然后在自己的接口中调用真实组件的接口。多种装饰器的话就都继承

效果:

  • 比静态继承更加灵活,减少了类,减少了复杂度
  • 与他的组件是不同的
  • 不必为了不需要的特征付出代价。避免了高层的类有太多的特征
  • 他的实现场景会比较适合较小的类,因为较大的类使用装饰器代价比较大,因为对外的接口必须是一致的,这个时候更适合策略模式

相关模式:

适配器模式不同之处在于他会给对象一个新的接口

FACADE(外观) –对象结构模式

意图:为子系统的一组接口提供一个一致的界面,定义了一个高层接口,接口使得子系统更容易使用。

适用性:

  • 为一个复杂子系统提供一个简单接口。
  • 客户程序与抽象类的实现部分分离,提高系统的独立性和可移植性。
  • 当构建一个层次结构的子系统,facade 模式定义每层的入口点,如果子系统相互依赖,可以让他们仅通过 facade 通讯,简化他们之间的依赖关系。

效果:

  • 对客户屏蔽子系统组件,减少客户处理的数量使得使用更加方便
  • 实现了子系统与客户之间的松耦合关系,消除复杂的依赖

facade 也有点像适配器,但是 facede 是创造了新的接口,而适配器是使两个已有的接口协同工作

FLYWEIGHT(享元) –对象结构型

意图:运用共享技术有效支持大量细粒度的对象

注意:这里很大程度上并不是取决于创造的代价,而是调用的频率

适用性:

  • 应用程序使用了大量的对象
  • 大量的对象造成了很大的存储开销
  • 大多数状态都可以变为外部状态
  • 应用程序不依赖于对象标识

结构:

就是有个享元抽象类,然后有个存储着享元的池子。普通情况下都是直接从池子里获取享元,当不需要共享的时候。也有一个子类实现了享元接口,可以直接 new 出来,大部分时候都是从池子里面拿。注意享元内部的状态都是共享的状态。想要不同的地方,只能使用享元的时候从外部传入。

效果:

共享的 flyweight 越多,空间的节省也就越大。

PROXY(代理) –对象结构型模式

意图:对其他对象提供一种代理以控制这个对象的访问。

使用性:

  • 远程调用:对象在不同的地址空间提供局部代理
  • 虚代理:就是开销的问题,比如浏览器会先用一个空的图片在那边占个位置,然后慢慢下载
  • 保护代理:就是对象应该有不同的访问权限的时候

实现:

就是代理类里面聚合了一个实例,然后提供了与实例一样的接口,将操作代理到实例上。

效果:

  • 隐藏一个对象存在于不同地址空间的事实
  • 进行最优化,根据要求创建对象,就是一开始没必要实例化,调用的时候再实例化
  • 加一些其他的内务处理

其他模式:

  • 与适配器的区别在于适配器提供的是不同的接口
  • 与装饰器的模式实现很像,目的不同,装饰器是增加功能,代理是控制管理

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com

文章标题:设计模式 -- 结构型模式

文章字数:1.9k

本文作者:泽鹿

发布时间:2019-08-28, 16:45:23

最后更新:2019-08-28, 16:45:23

原始链接:http://panyifei.github.io/2019/08/28/读书笔记/设计模式/4章结构型模式/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏