设计模式学习笔记三:结构型模式(Structural Pattern)
7:适配器模式 --Adapter Pattern
- 7.1 定义:将一个接口转化成客户希望的另外一个接口,使接口不兼容的那些类可以一起工作
- 7.2 目标:用于不兼容结构的协调
- 7.3 三个角色:Target(目标抽象类)、Adapter(适配器类)、Adaptee(适配者类)
- 7.4 别名:包装器(Wrapper)
- 7.5 分类:对象适配器模式、类适配器模式、双向适配器模式、缺省适配器模式
- 7.6 优点:将目标类和适配者类解耦、增加了类的透明性和复用性、增加灵活性和扩展性,完全符合开闭原则、一个对象适配器尅适配多个不同的适配者、可以适配一个适配者的子类
- 7.7 缺点:要在适配器中置换配置类的某些方法比较麻烦
- 7.8 适用场景:使用现有类,而这些类不符合系统需要;想创建一个可以重复使用的类用于与一些彼此之间没有太大关联的类
- 7.9 场景举例:重用已有加密算法
- 7.10 现实举例:电源适配器,用于生活用电和笔记本电脑即可兼容
8:桥接模式 --Bridge Pattern
- 8.1 定义:将抽象部分与实现部分分离,使它们都可以独立地变化
- 8.2 目标:处理多维度变化;解决处理多层继承存在问题
- 8.3 四个角色:Abstraction(抽象层)、RefinedAbstraction(扩充抽象类)、Implementor(实现类接口)、ConcreteImplementor(具体实现类)
- 8.4 别名:柄体模式(Handle and Body)或接口模式(Interface)
- 8.5 优点:分离抽象接口以及实现部分、桥接模式尅取代多层继承方案(多层继承违背了单一职责,复用性较差,且类的个数非常多)、提高了系统的可扩展性
- 8.6 缺点:增加系统理解和设计难度
- 8.7 适用场景:如果要避免两层继承关系,桥接模式可以在抽象建立关系
- 8.8 场景举例:为了减少生成子类数目,实现将操作系统和图像文件格式两个维度分离
9:组合模式 --Composite Pattern
- 9.1 定义:组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构
- 9.2 目标:树形结构处理
- 9.2 三个角色:Component(抽象构件)、Leaf(叶子构件)、Composite(容器构件)
- 9.3 别名:整体-部分模式
- 9.4 分类:透明组合模式、安全组合模式
- 9.5 优点:清楚地定义分层次的复杂对象、为树形结构的面向对象实现提供一个灵活方案
- 9.6 缺点:在增加新构件时很难对容器中构件类型进行限制
- 9.7 适用场景:在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异;在使用面向对象语言开发的系统中需要处理一个树形结构
- 9.8 场景举例:系统中一层层目录和文件的管理
10: 装饰模式 --Decorator Pattern
- 10.1 定义:动态地给一个对象增加一些额外的职责
- 10.2 目标:扩展系统功能、替换继承的技术(通过继承方式不方便支撑情况)
- 10.3 四个角色:Component(抽象构件)、ConcreteComponent(具体构件)、Decorator(抽象装饰类)、ConcreteDecorator(具体装饰类)
- 10.4 分类:透明装饰模式、半透明装饰模式
- 10.5 要点:尽量保持装饰类的接口与被装饰类的接口相同、不要把太多的行为放在具体构件类中,可以通过装饰类对其进行扩展
- 10.6 优点:对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加
- 10.7 缺点:使用装饰模式进行系统设计时将产生很多小对象
- 10.8 适用场景:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
- 10.9 场景举例:对加密后的结果进行二次加密
- 10.10 现实举例:类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能
11: 外观模式 --Facade Pattern
- 11.1 定义:外部与一个子系统的通信通过一个统一的外观对象进行,为子系统重的一组接口提供一个一致的入口
- 11.2 目标:提供统一入口;进行多个功能统一封装,减少客户端调用操作
- 11.2 别名:门面模式
- 11.3 要点:外观模式和适配器模式有什么区别
- 11.4 两个角色:Facade(外观角色)、SubSystem(子系统角色)
- 11.5 优点:对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目并使得子系统使用起来更加容易;提供了一个访问子系统的统一入口
- 11.6 缺点:不能很好地限制客户端直接使用子系统类
- 11.7 适用场景:当要为访问一系列复杂的子系统提供一个简单入口、客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统和客户端解耦
12:享元模式 --Flyweight Pattern
- 12.1 定义:运用共享技术有效地支持大量细粒度对象的复用
- 12.2 目标:实现对象的复用,运用共享技术有效地支持大量细粒度对象的复用
- 12.3 别名:轻量级模式
- 12.4 四个角色:Flyweight(抽象享元类)、ConcreteFlyweight(具体享元类)、UnsharedConcreteFlyweight(非共享具体享元类)、FlyweightFactory(享元工厂类)
- 12.5 分类:单纯享元模式、复合享元模式
- 12.6 优点:主要优点极大减少内存中对象的数量
- 12.7 缺点:需要分离出内部状态和外部状态
- 12.8 适用场景:一个系统有大量相同或者相似的对象,造成内存的大量耗费
- 12.9 场景举例:围棋系统棋子设计
13:代理模式 --Proxy Pattern
- 13.1 定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
- 13.2 目标:对象的间接访问
- 13.3 要点:代理模式和装饰模式有点类似,但是代理模式主要给真实主题类增加一些全新的职责,例如:权限控制、缓存处理、远程访问;
这些职责与原职责不属于同一问题域。而装饰模式是对原有职责的扩展,这些职责属于同一问题域。 - 13.4 三个角色:Subject(抽象主题角色)、Proxy(代理主题角色)、RealProxy(真实主题角色)
- 13.5 模式:远程代理、虚拟代理、保护代理、缓冲代理、智能引用代理
- 13.6 优点:能够协调调用者和被调用者,在一定程度上降低了系统的耦合度,满足迪米特法则
- 13.7 缺点:增加中间层影响效率,构件复杂
- 13.8 适用场景:当客户端对象需要访问远程主机中的对象时,可以使用远程代理
- 13.9 Java动态代理:Proxy类、InvocationHandler接口
声明:学习内容均来自《设计模式的艺术》这本书