为子系统的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更容易使用。3d
一、若是你但愿为一个复杂的子系统提供一个简单接口的时候代理
二、若是想要让客户程序和抽象类的实现部分松散耦合cdn
三、若是构建多层结构的系统对象
将一个类的接口转换成 客户但愿的另一个接口。使得本来因为接口不兼容的类能够一块儿工做。blog
Target:定义客户端须要的跟特定领域相关的接口。继承
Adaptee:已经存在的接口,一般能知足客户端的功能要求,可是接口与客户端要求的特定领域接口不一致,须要被适配。接口
Adapter:适配器,把Adaptee适配成为Client须要的Target。内存
一、若是你想要使用一个已经存在的类,可是它的接口不符合你的需求get
二、若是你想建立一个能够复用的类,这个类可能和一些不兼容的类一块儿工做it
三、若是你想使用一些已经存在的子类,可是不可能对每个子类都进行适配
将抽象部分与它的实现部分分离,使它们均可以独立地变化。
RefinedAbstraction:扩展抽象部分的接口,一般在这些对象里面,定义跟实际业务相关的方法,这些方法的实现一般会使用Abstraction中定义的方法,也可能须要调用实现部分的对象来完成。
Implementor:定义实现部分的接口,这个接口不用和Abstraction里面的方法一致,一般是由Implementor接口提供基本的操做,而Abstraction里面定义的是基于这些基本操做的业务方法,也就是说Abstraction定义了基于这些基本操做的较高层次的操做。
ConcreteImplementor:真正实现Implementor接口的对象。
一、若是你不但愿在抽象和实现部分采用固定的绑定关系,能够采用桥接模式,来把抽象和实现部分分开,而后在程序运行期间来动态的设置抽象部分须要用到的具体的实现,还能够动态切换具体的实现。
二、若是出现抽象部分和实现部分都应该能够扩展的状况,能够采用桥接模式,让抽象部分和实现部分能够独立的变化,从而能够灵活的进行单独扩展,而不是搅在一块儿,扩展一边会影响到另外一边。
三、若是但愿实现部分的修改,不会对客户产生影响,能够采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,能够独立于抽象部分,也就不会对客户产生影响了,也能够说对客户是透明的。
四、若是采用继承的实现方案,会致使产生不少子类,对于这种状况,能够考虑采用桥接模式,分析功能变化的缘由,看看是否能分离成不一样的纬度,而后经过桥接模式来分离它们,从而减小子类的数目。
将对象组合成属性结构以表示“部分-总体”的层次结构,组合模式使得用户对单个对象和组合对用的使用具备一致性。
Leaf:叶子节点对象,定义和实现叶子对象的行为,再也不包含其它的子节点对象。
Composite:组合对象,一般会存储子组件,定义包含子组件的那些组件的行为,并实如今组件接口中定义的与子组件有关的操做。
Client:客户端,经过组件接口来操做组合结构里面的组件对象。
一、若是你想表示对象的部分-总体层次结构,能够选用组合模式,把总体和部分的操做统一块儿来,使得层次结构实现更简单,从外部来使用这个层次结构也简单;
二、若是你但愿统一的使用组合结构中的全部对象,能够选用组合模式,这正是组合模式提供的主要功能;
动态的给一个对象添加一些额外的职责。就增长功能来讲,装饰模式比生成子类更灵活。
Decorator:全部装饰器的抽象父类,须要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。注意,这个被装饰的对象不必定是最原始的那个对象了,也多是被其它装饰器装饰事后的对象,反正都是实现的同一个接口,也就是同一类型。
ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰对象添加的功能。
一、若是须要在不影响其它对象的状况下,以动态、透明的方式给对象添加职责
二、若是不合适使用子类来进行扩展的时候
运用共享技术有效地支持大量细粒度的对象。
ConcreteFlyweight:具体的享元实现对象,必须是可共享的,须要封装flyweight的内部状态。
UnsharedConcreteFlyweight:非共享的享元实现对象,并非全部的Flyweight实现对象都须要共享。非共享的享元实现对象一般是对共享享元对象的组合对象。
FlyweightFactory:享元工厂,主要用来建立并管理共享的享元对象,并对外提供访问共享享元的接口。
Client:享元客户端,主要的工做是维持一个对flyweight的引用,计算或存储享元对象的外部状态,固然这里能够访问共享和不共享的flyweight对象。
一、若是一个应用程序使用了大量的细粒度对象,可使用享元模式来减小对象数量;
二、若是因为使用大量的对象,形成很大的存储开销,可使用享元模式来减小对象数量,并节约内存;
若是对象的大多数状态均可以转变为外部状态,好比经过计算获得,或是从外部传入等,可使用享元模式来实现内部状态和外部状态的分离; 若是不考虑对象的外部状态,能够用相对较少的共享对象取代不少组合对象,可使用享元模式来共享对象,而后组合对象来使用这些共享对象;
为其余对象提供一种代理以控制对这个对象的访问。
实现与具体的目标对象同样的接口,这样就可使用代理来代替具体的目标对象
保存一个指向具体目标对象的引用,能够在须要的时候调用具体的目标对象,能够控制对具体目标对象的访问,并可能负责建立和删除它
Subject:目标接口,定义代理和具体目标对象的接口,这样就能够在任何使用具体目标对象的地方使用代理对象
RealSubject:具体的目标对象,真正实现目标接口要求的功能。
须要为一个对象在不一样的地址空间提供局部表明的时候,可使用远程代理;
须要按照须要建立开销很大的对象的时候,可使用虚代理;
须要控制对原始对象的访问的时候,可使用保护代理;
须要在访问对象的时候执行一些附加操做的时候,可使用智能指引代理;