定义:将一个接口转换成为客户想要的另一个接口,Adapter Pattern使接口不兼容的那些类可以一起工作。
说明:
对于类适配器:
1.用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
2.使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
3.仅仅引入了一个对象,并不需要额外的指针间接引用Adaptee.
对于对象适配器:
1.允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。Adapter也可以一次给所有的Adaptee添加功能。
2.使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
优势:可以将一个类的接口和另一个类的接口匹配起来。
应用场景:
1. 对象需要利用现存的并且接口不兼容的类。
2. 你需要创建可重用的类以协作其它接口不一定兼容的类。
3. 你需要使用若干个现存的子类但又不想派生这些子类的每一个接口。
(2)Bridge Pattern
定义:将抽象部分与实现部分分离,使得它们两部分可以独立地变化。
说明:一般来讲,Implementor接口仅提供基本操作,而Abstraction定义了接口可能会做的更多复杂的操作。
“抽象部分与实现部分”中的“实现”是指抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。
请牢记:该模式有一个抽象(及其派生)和一个实现组成;设计实现的接口时,应该考虑到它必须支持抽象类的不同派生类。
意图:将一组实现与另一组使用它们的对象分离
问题:一个抽象类的派生类必须使用多个实现,但不能出现类数量爆炸性的增长。
解决:为所有实现定义一个接口,供抽象类的所有派生类使用。
优势:可以从接口中分离实现功能,舍得设计更具扩展性,这样,客户调用方法时不需要知道实现的细节;减少了子类;
劣势:抽象类与实现类的双向连接使得运行速度减慢
应用场景:
1. 你想避免抽象方法和其它实现方法绑定在一起;
2. 抽象接口和它的实现都需要扩展出子类以备使用;
3. 变得实现的方法根本不需要影响客户程序调用部分;
(3)Composite Pattern
定义:组合单个对象形成树形结构以表示整体-部分关系的结构层次,组合模式对单个对象和组合对象的使用具有一致性。
优势:可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新部件更容易,因为它让客户忽略乐层次的不同性,而它的结构又是动态的,提供了对象管理的灵活接口。
劣势:使得设计变得更加抽象,对象的商业规则如果很复杂,则实现组合模式具有很大的挑战,而且并不是所有的方法都与叶部件子类有关联。
应用场景:
1. 想表示一个对象整体和部分层次;
2. 想让客户能够忽略不同对象的层次的变化
3. 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。
(4)Decorator Pattern
定义:动态地给一个对象增加其它责任(Responsibility),就增加对象的功能来说,装饰模式比生成子类实现更为灵活。
问题:要使用对象将执行所需的基本功能, 但是,可能需要为这个对象将添加某些功能,这些附加的功能可能发生在对象的基础功能之前或之后。(Java基础类在I/O处理中广泛采用了该模式)
说明:派生子类会影响对象的内部,而一个Decorator只会影响对象的外表。
优势:它提供了比静态继承更好的柔性,允许开发一系列的功能类用来代替增加对象的行为,这既不会污染原来对象的源码,还能使代码更容易编写,使类更有扩展性;还可以建立连接的装饰对象关系链(不易太长,否则初始化对象和链中传递信息需要较长的时间)
劣势:如果原来的对象接口发生变化,它所有的装饰类都要修改以匹配它的变化。
应用场景:
1. 你想透明并且动态地给对象增加新的职责,而不影响其它对象。
2. 你给对象增加的职责在未来会发生变化
3. 用子类扩展功能不实际的情况下。
(5)Façade Pattern
定义:提供一个统一的接口去访问多个子系统的多个不同的接口,外观模式定义了一个高层次的接口,使得子系统更容易被使用。
优势:提供了一个简单且公有的接口去处理复杂的子系统,并且没有减少子系统的功能;屏蔽了子系统的复杂性,避免了客户与子系统直接连接,也减少了子系统之间的连接(子系统通过各自的Façade去访问其它子系统)
劣势:限制了客户的自由,减少了可变性
应用场景:
1. 你需要复杂的子系统提供一个简单的接口
2. 客户与抽象的实现类中存在若干依赖
3. 子系统分层是必要的或架构要求的情况下。
(6)Flyweight Pattern
定义:运用共享技术有效地支持大量细粒度的对象。系统只使用少量的对象,而这些对象都相近,状态变化很小,对象使用次数增多。
说明:客户初次从轻量级工厂取flyweight时,轻量级工厂创建一个新的具体flyweight对象,并且保存起来,下次客户取用时,就不用重新创建,直接在保存池中返回。客户负责处理flyweight的状态。
优势:Flyweight模式需要你认真考虑如何能细化对象,以减少处理的对象数量,从而减少存留对象在内存或其它存储设备中的占用量;
劣势:需要维护大量对象的外部状态,如果外部状态的数量大,传递、查找、计算这些数据变成非常复杂。当难以分清内部状态外部状态时,不宜采用该模式。
应用场景:
1. 系统需要存在大量的对象而共享某些本质的、不变的信息。
2. 对象可以同时用于多个环境下。
3. 在每个实例下,flyweight可以作为一个独立的对象。
(7)Proxy Pattern
定义:为其他对象提供一个代理或地方以控制对这个对象的访问,当客户向proxy对象第一次提出请求时,proxy实例化真实的对象,并且将请求传给它,以后所有的客户请求都经由proxy传给封装了的真实对象。
说明:Proxy Pattern分为四种:
1.Virtual Proxy——Proxy不会生成一个真实的耗费代理,直到非常有必要时(首次有请求)。它用来存放花费大(实例需要很长时间)的真实对象。
2.Remote Proxy——本地的代理对象控制一个远程的真实对象。
3.Protection Proxy——代理检查调用真实对象所需要的权限。
4.Smart Reference——当调用真实的对象时,代理处理另外一些事。
(1)计算真实对象的引用次数,在没有被引用时自动释放;
(2)首次被引用时装载存留(保存在硬盘或内存、数据库等)的对象);
(3)在访问时检查真实对象是否锁定,确保没有其它对象会改变它。
优势:当对象在远程服务器上,要通过网络来生成时,速度可能会很慢,应用Remote Proxy模式可以掩蔽对象由网络生产的过程,系统地速度会加快;对于大图片得加载,Virtual Proxy模式可以让加载在后台进行;前台用的Proxy对象使得整体运行速度得到优化;Protect Proxy可以验证真实对象的引用权限。
劣势:请求的处理速度会变慢,并且实现Proxy模式需要额外的工作。