结构型模式
1 定义
结构型模式描述如何将类和对象组合起来,形成更大的结构,就像搭积木,可以通过简单积木的组合形成复功能更为强大的积木。
2 类型
- 类结构模式 : 由多个类可以组成一个更大的系统,在类结构模式中只存在继承关系和实现关系
- 对象结构模式 : 通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。根据合成复用原则,在系统中尽量使用关联关系来替代继承关系,因此大部分结构模式都是对象结构模式
适配器模式
1 模式动机
如果现有的类可以满足客户类的功能需求,但它所提供的接口方法不一定是客户类所期望的,这种情况下我们需要适配器模式来将现有的接口转化为客户类所期望的接口
2 模式结构
- Target : 目标抽象类
- Adapter : 适配器类
- Adaptee : 适配者类
- Client : 客户端类
类适配器
对象适配器
3 优点
- 将适配器类和目标类解耦,通过引入适配器类来重用现有的适配者类,而无须修改源代码
- 增加类的透明性和复用性
- 灵活性和扩展性都非常好,通过定义配置文件可以很方便的更换适配器
桥接模式
1 模式动机
设想如果要绘制矩形、圆形、椭圆形、正方形,我们至少需要四个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色。此时至少有以下两种实现方案
- 第一种设计方案是为每一种形状都提供一套各种颜色的实现版本
- 第二种设计方案是根据实际需要对形状和颜色进行组合
2 模式定义
将抽象部分与实现部分分离,使他们都可以独立变化,它是一种对象结构型模式。桥接模式中的脱藕是指在一个软件系统的抽象化和实现化之间使用关联关系而不是继承关系,从而使两者可以相对独立的变化
3 模式结构
- Abstraction : 抽象类
- RefinedAbstraction : 扩充抽象类
- Implementer : 实现类接口
- ConcreteImplementer : 具体实现类
4 实例解析
- 模拟毛笔
- 跨平台视屏播放器
如果需要开发一个视频播放器,可以在不同操作系统平台上()Windows,Linus,Unix)播放多种视频格式的视频文件(MPEG、RMVB、AVI、WMV)
5 优点
- 分离抽象接口及其实现部分
- 桥接模式是比多继承方案更好的解决办法
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
- 实现细节对用户透明,可以对用户隐藏实现细节
6 缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
- 桥接模式要求正确识别出系统两个独立变化的维度,因此其使用范围具有一定的局限性
组合模式
1 模式动机
组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用他们得时候无须区分,可以一致得对待容器对象和叶子对象。
2 模式结构
- Component : 抽象构件
- Leaf : 叶子构件
- Composite : 容器构件
- Client : 客户端
3 模式分析
- 组合模式的关键是定义了一个抽象构建类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构建类进行编程,无须知道他代表的是叶子还是容器,可以对其进行统一处理
- 同时容器对象和抽象构建类还建立了一个聚合关联关系,在容器对象中既可以包括叶子也可以包括容器,以此实现递归组合,形成树形结构。
4 模式实例
- 水果盘
- 文件浏览
5 优点
- 可以清晰的定义分层次的复杂对象
- 客户端调用简单,客户端可以一致的使用组合结构或其中的单个对象
6 模式应用
- XML文档解析
- 操作系统的文档系统
- JDK中的AWT/Swing是组合模式在JAVA类库中的实际应用
装饰模式
1 模式动机
一般有两种方式实现给一个类或者对象增加行为
- 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类使得子类再拥有自身方法的同时还拥有父类的方法。但是这种方式是静态的,用户无法控制增加行为的方法和时机
- 关联机制:即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象以便扩充自己的行为,我们称这个嵌入的对象为装饰器
装饰模式以对客户透明的方式动态的给一个对象附加上了更多的责任,换言之,用户并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的前提下,将对象的功能加以扩展。
2 模式结构
- Component : 抽象构建
- ConcreteComponent : 具体构建
- Decorator : 抽象装饰类
- ConcreteDecorator : 具体装饰类
3 模式实例
- 变形金刚
- 多重加密系统
4 优点
- 装饰模式和继承机制的目的都是要扩展对象的功能,但是装饰模式可以提供比继承关系更多的灵活性
- 通过动态的方式扩展一个对象的功能,比如通过配置文件来选择不同的装饰器,从而实现不同的行为
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的排列组合。可以使用多个具体装饰类来装饰同一个对象,得到更为强大的对象
- 具体构建类和具体装饰类可以独立变化,用户可以增加新的具体构建类和具体装饰类,使用时在对其进行组合,原有代码无须改动,符合开闭原则
5 应用
- (1)
- (2)
外观模式
1 模式动机
引入外观模式后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低系统的耦合度
2 模式结构
- Facade : 外观角色
- SubSystem : 子系统角色
3 模式实例
- 电源总开关
- 文件加密