设计模式-结构型

7、外观模式(Facade)

一、定义

为子系统的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更容易使用。3d

二、类图

三、调用顺序

四、代码示例

五、什么时候选用外观模式

一、若是你但愿为一个复杂的子系统提供一个简单接口的时候代理

二、若是想要让客户程序和抽象类的实现部分松散耦合cdn

三、若是构建多层结构的系统对象

8、适配器(Adapter)

一、定义

将一个类的接口转换成 客户但愿的另一个接口。使得本来因为接口不兼容的类能够一块儿工做。blog

二、类图

Client:客户端,调用本身须要的领域接口Target。

Target:定义客户端须要的跟特定领域相关的接口。继承

Adaptee:已经存在的接口,一般能知足客户端的功能要求,可是接口与客户端要求的特定领域接口不一致,须要被适配。接口

Adapter:适配器,把Adaptee适配成为Client须要的Target。内存

三、代码示例

四、什么时候选用适配器模式

一、若是你想要使用一个已经存在的类,可是它的接口不符合你的需求get

二、若是你想建立一个能够复用的类,这个类可能和一些不兼容的类一块儿工做it

三、若是你想使用一些已经存在的子类,可是不可能对每个子类都进行适配

9、桥接模式(Bridge)

一、定义

将抽象部分与它的实现部分分离,使它们均可以独立地变化。

二、类图

Abstraction:抽象部分的接口。一般在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的方法,须要调用实现部分的对象来完成。这个对象里面的方法,一般都是跟具体的业务相关的方法。

RefinedAbstraction:扩展抽象部分的接口,一般在这些对象里面,定义跟实际业务相关的方法,这些方法的实现一般会使用Abstraction中定义的方法,也可能须要调用实现部分的对象来完成。

Implementor:定义实现部分的接口,这个接口不用和Abstraction里面的方法一致,一般是由Implementor接口提供基本的操做,而Abstraction里面定义的是基于这些基本操做的业务方法,也就是说Abstraction定义了基于这些基本操做的较高层次的操做。

ConcreteImplementor:真正实现Implementor接口的对象。

三、调用顺序

四、示例代码

五、什么时候选用桥接模式

一、若是你不但愿在抽象和实现部分采用固定的绑定关系,能够采用桥接模式,来把抽象和实现部分分开,而后在程序运行期间来动态的设置抽象部分须要用到的具体的实现,还能够动态切换具体的实现。

二、若是出现抽象部分和实现部分都应该能够扩展的状况,能够采用桥接模式,让抽象部分和实现部分能够独立的变化,从而能够灵活的进行单独扩展,而不是搅在一块儿,扩展一边会影响到另外一边。

三、若是但愿实现部分的修改,不会对客户产生影响,能够采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,能够独立于抽象部分,也就不会对客户产生影响了,也能够说对客户是透明的。

四、若是采用继承的实现方案,会致使产生不少子类,对于这种状况,能够考虑采用桥接模式,分析功能变化的缘由,看看是否能分离成不一样的纬度,而后经过桥接模式来分离它们,从而减小子类的数目

10、组合模式(Composite)

一、定义

将对象组合成属性结构以表示“部分-总体”的层次结构,组合模式使得用户对单个对象和组合对用的使用具备一致性。

二、类图

Component:抽象的组件对象,为组合中的对象声明接口,让客户端能够经过这个接口来访问和管理整个对象结构,能够在里面为定义的功能提供缺省的实现。

Leaf:叶子节点对象,定义和实现叶子对象的行为,再也不包含其它的子节点对象。

Composite:组合对象,一般会存储子组件,定义包含子组件的那些组件的行为,并实如今组件接口中定义的与子组件有关的操做。

Client:客户端,经过组件接口来操做组合结构里面的组件对象。

三、示例代码

四、什么时候选用组合模式

一、若是你想表示对象的部分-总体层次结构,能够选用组合模式,把总体和部分的操做统一块儿来,使得层次结构实现更简单,从外部来使用这个层次结构也简单;

二、若是你但愿统一的使用组合结构中的全部对象,能够选用组合模式,这正是组合模式提供的主要功能;

十一装饰者(Decorator)

一、定义

动态的给一个对象添加一些额外的职责。就增长功能来讲,装饰模式比生成子类更灵活。

二、类图

Component:组件对象的接口,能够给这些对象动态的添加职责。 ConcreteComponent:具体的组件对象,实现组件对象接口,一般就是被装饰器装饰的原始对象,也就是能够给这个对象添加职责。

Decorator:全部装饰器的抽象父类,须要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。注意,这个被装饰的对象不必定是最原始的那个对象了,也多是被其它装饰器装饰事后的对象,反正都是实现的同一个接口,也就是同一类型。

ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰对象添加的功能。

三、示例代码

四、什么时候选用装饰模式

一、若是须要在不影响其它对象的状况下,以动态、透明的方式给对象添加职责

二、若是不合适使用子类来进行扩展的时候

12、享元模式(Flyweight)

一、定义

运用共享技术有效地支持大量细粒度的对象。

二、类图

Flyweight:享元接口,经过这个接口flyweight能够接受并做用于外部状态。经过这个接口传入外部的状态,在享元对象的方法处理中可能会使用这些外部的数据。

ConcreteFlyweight:具体的享元实现对象,必须是可共享的,须要封装flyweight的内部状态。

UnsharedConcreteFlyweight:非共享的享元实现对象,并非全部的Flyweight实现对象都须要共享。非共享的享元实现对象一般是对共享享元对象的组合对象。

FlyweightFactory:享元工厂,主要用来建立并管理共享的享元对象,并对外提供访问共享享元的接口。

Client:享元客户端,主要的工做是维持一个对flyweight的引用,计算或存储享元对象的外部状态,固然这里能够访问共享和不共享的flyweight对象。

三、调用顺序

四、示例代码

五、什么时候选用享元模式

一、若是一个应用程序使用了大量的细粒度对象,可使用享元模式来减小对象数量;

二、若是因为使用大量的对象,形成很大的存储开销,可使用享元模式来减小对象数量,并节约内存;

若是对象的大多数状态均可以转变为外部状态,好比经过计算获得,或是从外部传入等,可使用享元模式来实现内部状态和外部状态的分离若是不考虑对象的外部状态,能够用相对较少的共享对象取代不少组合对象,可使用享元模式来共享对象,而后组合对象来使用这些共享对象;

十3、代理模式(Proxy)

一、定义

为其余对象提供一种代理以控制对这个对象的访问。

二、类图

Proxy:代理对象,一般具备以下功能:

  1. 实现与具体的目标对象同样的接口,这样就可使用代理来代替具体的目标对象

  2. 保存一个指向具体目标对象的引用,能够在须要的时候调用具体的目标对象,能够控制对具体目标对象的访问,并可能负责建立和删除它

Subject:目标接口,定义代理和具体目标对象的接口,这样就能够在任何使用具体目标对象的地方使用代理对象

RealSubject:具体的目标对象,真正实现目标接口要求的功能。

三、调用顺序

四、示例代码

五、什么时候选用代理模式

须要为一个对象在不一样的地址空间提供局部表明的时候,可使用远程代理;

须要按照须要建立开销很大的对象的时候,可使用虚代理;

须要控制对原始对象的访问的时候,可使用保护代理;

须要在访问对象的时候执行一些附加操做的时候,可使用智能指引代理;

相关文章
相关标签/搜索