适配器模式
需要融合具有相似功能的但是具有不同接口的模块
应用:WINE--在linux上运行windows程序的平台,其实可以看成架构上的适配器。windows程序不需要修改过代码就能够直接在linux上运行。
MKS Toolkit, 提供了shell命令到windows命令的转换,使得用户可以再windows上运行shell命令。
合成模式
需要考虑部分和整体的等级结构,客户需要忽略个体构件和组合构件的区别--即需要平等对待所有组件
文件系统:把目录和文件当做同一种对象对待--合成模式应用的典型场合。
透明方式:在Component中添加add(),remove(),getChild(),方法。优点是透明(分不出叶子和树枝),缺点是不安全--叶子有add()等方法,编译时不出错,运行时出错。
安全方式:只在Composite中添加管理子对象的方法。
使用合成模式的时机:
1 需要考虑对象的部分和整体的等级结构2 需要客户忽略个体构建和组合构建的区别,客户需要平等对待所有构件
装饰模式
需要动态的增强某些对象的功能,而且要具有比继承更加丰富的灵活性
以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案
使用装饰模式的时机:
1 需要动态的给一个对象增加责任,这个责任还可以撤销2 需要增加由一系列基本功能组合而成的非常强大的功能。
装饰模式的优缺点:
优点: 扩展对象功能,装饰模式具有更高的灵活性--可以动态的贴上或除掉功能。通过不同装饰的组合,可以创造出很多不同的行为。
缺点: 灵活性也意味着更容易出错
与其他模式的关系:
装饰器模式与适配器模式:用意不同,一个是维持接口增强性能,另一个是改变接口。
与策略模式:用意不同:装饰模式是要替换外表,保留内心,而策略模式主要实现算法的可替代性。
代理模式
对真实的对象的访问需要加以控制
间接的“美”:降低耦合度
代理的种类
远程代理(访问远程对象就像访问本地对象一样)、虚拟代理、保护代理、防火墙代理、同步化代理、智能引用(在对真实的对象访问之前或之后增加检查或记录功能)
在使用的时候将引用声明为抽象主题,实际对象创建一个代理主题。
Subject subject = new ProxySubject();
subject.request();
Subject subject = new ProxySubject();
subject.request();
代理模式与装饰模式:二者有共同点:装饰与被装饰者,代理与被代理者都具有相同的接口。但是用意不同,装饰模式意在增强被装饰对象的功能,而代理模式意在对被代理对象施加控制。
享元模式
系统需要共享大量的具有不可区分的内部状态的对象(内蕴对象),而这些对象的大部分状态可以外部化。优点:降低内存中对象的数量
java中的String对象就是享元对象,一旦创建出来就不会改变,相同的String对象是共享的。
门面模式
简化子系统的接口