在风雨中,砥砺前行,共勉 !
适配器模式 Adapter Pattern
定义:将一个接口转换成客户希望的另一个接口,使接口可以兼容不同的类使用。
类型:类结构型模式、对象结构型模式。
角色:
- Target 目标抽象类:定义客户所需的接口或抽象类
- Adapter 适配器类
- Adaptee 适配者类:被适配的角色
优势:
- 将目标类和适配者类接口,通过适配器来重用现有的适配者类。
- 增加了类的复用性和透明性。
- 扩展方便。
缺点:
- 一次只能适配一个适配者类
桥接模式 Bridge Pattern
定义:将抽象与实现分离,使他们可以独立的变化。
类型:对象结构型模式。
角色:
- Abstraction 抽象类
- RefinedAbstraction 扩充抽象类
- Implementor 实现类接口
- ConcreteImplementor 具体实现类
桥接模式与适配器模式用于设计的不同阶段。
桥接模式用于系统的初步设计,对于在两个独立变化维度的类,可以将其分为抽象化和实现化两个角色,使他们分别进行变化。
适配器模式用于在初步设计后,当发现系统与已有类无法协同工作是使用。
ex:铅笔有多个型号,同时每个型号的铅笔又可绘画多种颜色。
优点:
- 分离抽象接口及其实现部分。所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
- 扩展性好
- 在很多情况下,可取代多继承方案
缺点:
- 桥接模式的使用会增加系统的使用和设计难度。
组合模式 Composite Pattern
定义:组合多个对象形成树形结构,以表示具有“整体-部分”关系的层次结构。
组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。
类型:对象结构型模式。
在该模式中,抽象构件类是所有容器类和叶子类的公共父类。客户端针对抽象构件类编程。
角色:
- Component 抽象构件
- Leaf 叶子构件
- Composite 容器构件
透明组合和安全组合
- 透明组合不够安全。因为叶子对象和容器对象在本质上是有区别的。叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此为其提供add()、remove()以及getChild()等方法是没有意义的,这在编译阶段不会出错,但在运行阶段如果调用这些方法可能会出错(如果没有提供相应的错误处理代码)
- 安全组合不够透明。因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件。
优点:
- 可以清楚的定义分层次的复杂对象
- 扩展性好
缺点:
- 因为都来自于相同的抽象层。添加新构件是很难对容器中的构件类型进行限制。
ex:单位下发通知。单位为抽象构件,公司为容器,各个部门为叶子构件。
装饰模式 Decorator Pattern
定义:动态的给一个对象添加一些额外的职责,就添加对象功能来说,装饰模式比生成子类实现更为灵活。
类型:对象结构型模式。
角色:
-
Component 抽象构件
-
ConcreteComponent 具体构件
-
Decorator 抽象装饰类(核心)
-
ConcreteDecorator 具体装饰类
抽象构件位具体构件和抽象装饰类的共同父类。
ex:图形界面构件库;添加滚动条,黑色边框
.
注:
- 尽可能保持装饰类和被装饰类的接口相同。
- 尽可能保持具体构件类里的行为较少。
优点:
- 对于扩展对象功能,装饰模式比继承更灵活。
- 可以对一个对象,进行多次装饰。
- 具体装饰类和具体构建类相对独立,互不影响。
缺点:
- 产生的多个小对象,会占用系统资源。
- 代码的复杂度和维护成本会增减。
外观模式 Facade Pattern
定义:为子系统中的一组接口,提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
类型:对象结构型模式。
角色:
- Facade 外观角色
- SubSystem 子系统角色
ex:文件读写、加密操作
优点:
- 实现了客户端和子系统之间的松耦合。
- 减少了客户端所需处理的对象数目。
- 各子系统自检相互独立,不影响。
缺点:
- 不能很好的控制客户端直接使用子系统。
享元模式 Flyweight Pattern
享元对象能做到共享的关键是区分了内部状态和外部状态。
享元池。
类型:对象结构型模式。
运用共享技术有效的支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很少,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须要是细粒度对象,因此它又称为轻量级模式。
角色:
- Flyweight 抽象享元类
- ConcreteFlyweight 具体享元类
- UnSharedConcreteFlyweight 非共享具体享元类
- FlyweightFactory 享元工厂类(使用单例模式,返回唯一实例)
JDK中的String类使用了享元模式。
在享元模式中,引入了享元工厂类,作用是在于提供一个用于存储享元对象的享元池。当用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存新增的对象。
ex:围棋棋子。
注:
- 在享元模式的享元工厂类中,通常提供一个静态的工厂方法用于返回享元对象,使用简单工厂模式来生成享元对象。
- 在一个系统中,通常只有唯一一个享元工厂,可以使用单例模式来进行享元工厂类设计。
优点:
- 减少系统中对象的数量,节约资源。
- 享元模式外部状态相对独立,不会影响内部状态。
缺点:
- 使系统变得复杂。
- 读取外部状态运行时间较长
代理模式 Prototype Pattern
定义:给某一个对象提供一个代理或占位符,并有代理对象控制原对象的访问。
类型:对象结构型模式。
角色:
- Subject 抽象主题角色(声明接口)
- Proxy 代理主题角色
- RealSubject 真是主题角色
根据目的和实现方式可分为:
- 远程代理
- 虚拟代理
- 保护代理
- 缓冲代理
- 智能应用代理
ex:收费信息系统查询
优点:
- 能够协调调用者和被调用者,降低系统耦合度。
- 客户端可以针对抽象主题角色进行编程。
缺点:
- 由于在客户端和真实主题之间增加了代理对象,请求处理速度可能会变慢。