结构型模式7个
适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)
装饰者模式( Pattern)
装饰者模式( Pattern)属于结构型模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。它是通过创建一个包装对象,通过包装对象来包裹真实的对象,以达到装饰目的。

- Component:抽象组件,给具体类对象动态地添加职责。
- ConcreteComponent:抽象组件的具体实现类。
- Decorator:抽象装饰者,继承Component,用于拓展Component类的功能,但对于Component来说无需知道Decorator的存在。
- ConcreteDecorator:装饰者具体实现类。
咖啡添加了不同的调料,将收取不同的费用。因为调料数量众多,我们不能为每一种口味的咖啡创建一个类。
|
|
使用场景:
- (1)在不必改变原类和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
- (2)当不能采用继承和组合的方式对系统进行扩充或者不利于系统扩展和维护时。
外观模式(Facade Pattern)
外观模式(Facade Pattern)属于结构型模式,提供了一个统一的接口(具体类),用来访问子系统的一群接口(具体类)。外观定义了一个高层接口,让子系统更容易使用。
- Client:客户类,通过外观类与子系统进行交互。
- Facade:外观类,知道哪些子系统类负责处理请求,将客户端的请求代理给适当的子系统对象。
- Subsystem:子系统类,实现子系统功能,处理外观类指派的任务,注意子系统类不含有外观类的引用。
|
|
应用场景
- (1)客户端需要与多个子系统交互时,可使用外观模式。如当维护一个遗留的大型系统时,可能这个系统难以维护和拓展,但因为含有重要功能,新的需求必须依赖于它,则可以使用外观类,来为这个粗糙复杂的遗留代码提供一个简单的类接口,让新系统和外观类交互,而外观类负责与遗留的代码进行交互。
- (2)客户端程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern)属结构性模式,将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

- Client:客户类。
- Target:目标抽象类;
- Adapter:适配器类;
- Adaptee:适配者类;
|
|
应用场景
- (1)系统需要使用现有的类,而这些类的接口不符合系统的需要。
- (2)想要建立一个可以重复使用的类(适配器),用于与一些彼此之间没有太大关联的类建立联系。
适配器模式分为对象适配器和类适配器。前面所概述的是对象适配器。类适配器使用有限,因为类适配器需要使用多重继承,这个在java、C#中没有办法实现,但在C++中可以实现。
适配器模式(对象适配器)将一个对象包装起来改变其函数接口,来适应现有系统的需要; 装饰者模式讲一个对象包装起来以增加新的行为和责任;而外观模式将一群对象包装起来,以简化其函数接口。
组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。
FinanceDepartment、HRDepartment两个类作为叶结点,因此没有定义添加函数。而ConcreteCompany类可以作为中间结点,所以可以有添加函数。那么怎么添加呢?这个类中定义了一个链表,用来放添加的元素。
|
|
代理模式
为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。本文主要介绍虚代理和智能引用两种情况。
考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。
|
|
享元模式
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。
FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。
在围棋中,棋子就是大量细粒度的对象。其属性有内在的,比如颜色、形状等,也有外在的,比如在棋盘上的位置。内在的属性是可以共享的,区分在于外在属性。因此,可以这样设计,只需定义两个棋子的对象,一颗黑棋和一颗白棋,这两个对象含棋子的内在属性;棋子的外在属性,即在棋盘上的位置可以提取出来,存放在单独的容器中。相比之前的方案,现在容器中仅仅存放了位置属性,而原来则是棋子对象。显然,现在的方案大大减少了对于空间的需求。
|
|
桥接模式
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化。
考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。
|
|