结构型模式涉及到如何组合类和对象以获得更大的结构。
类结构型模式采用继承机制来组合接口或实现。
对象结构型模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的。
1. Adapter模式
类+对象结构型模式
意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性
想使用一个已经存在的类,而它的接口不符合你的需求。
(仅适用于对象Adapter)想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些可能不一定兼容的类)协同工作。
想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。
相关模式
Bridge模式的结构与对象适配器类似,但是Bridge模式的出发点不同。Bridge目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adapter则意味着改变一个已有对象的接口。
Decorator模式增强了其他对象的功能而同时不改变他的接口,因此decorator对应用程序的透明性比适配器好,结果是decorator支持递归组合,而纯粹使用适配器是不可能实现这一点的。
Proxy模式在不改变他的接口的条件下,为另一个对象定义了一个代理。
2. Bridge模式
对象结构型模式
意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
适用性
分离抽象与它的实现
类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
3. Composite模式
对象结构型模式
意图
将对象组合成树形结构以表示“部分—整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
4. Decorator模式
对象结构型模式
意图
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
相关模式
Adapter模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口,而适配器将个对象一个全新的接口。
Composite模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责——它的目的在于对象的聚集。
Strategy模式:用一个装饰你可以改变对象的外表,而Strategy模式使得你可以改变对象的内核。
5. Facade模式
对象结构型模式
意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
效果
它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。
相关模式
Abstract Factory模式可以与Facade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式建立子系统对象。Abstract Factory也可以代替Facade模式隐藏那些与平台相关的类。
Mediator模式与Facade模式的相似之处是,它抽象了一些已有的类的功能。然而,Mediator的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Facade模式仅对子系统对象的接口进行抽象,从而是他们更容易使用,它并不定义新功能,子系统也不知道Facade的存在。
通常仅需要一个Facade对象,因此Facade对象通常属于Singleton模式。
6. Flyweight模式
对象结构型模式
意图
运用共享技术有效地支持大量细粒度的对象。
7. Proxy模式
对象结构型模式
意图
为其他对象提供一种代理以控制对这个对象的访问。
效果
Remote Proxy可以隐藏一个对象存在于不同地址空间的事实。
Virtual Proxy可以进行最优化,例如根据要求创建对象。
Protection Proxies和Smart Reference都允许在访问一个对象时有一些附加的内务处理。
相关模式
Adapter模式为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此它的接口实际上可能只是实体接口的一个子集。
Decorator模式的实现部分与Proxy相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。