设计模式 -- 结构型模式
涉及到如何组合类和对象以获得更大的结构
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" 转载请保留原文链接及作者。