结构型设计模式总结

来源:互联网 发布:cryengine 源码编译 编辑:程序博客网 时间:2024/05/21 08:44

设计模式详述


Adapter

Adapter模式就是基于面向对象的方法,将多个具备不同外部接口的对象通过一个一致的接口,和调用者

进行交互。
Adaptee: 多个具备不同外部接口的对象
Target: 一致的接口
Adapter: 每个Adapter封装不同的Adaptee,实现一致的Target接口
Client: 调用者

 

Bridge

Bridge模式就是:基于面向对象的方法,将一个依赖于不同实现的复杂对象按照基本操作和上层操作分离

、具体实现和抽象接口分离的原则进行设计。
Implementor: 封装基本操作的接口
ConcreteImplementor: 基于不同的环境/场景的具体实现,实现Implementor接口
Abstraction: 实现对象上层操作的对象,这些上层操作逻辑对于不同的ConcreteImplementor是统一的,

Abstraction中保存指向某个ConcreteImplementor的基类指针,通过调用Implementor的统一接口,实现

基本操作和上层操作分离、具体实现和抽象接口分离。
RefinedAbstraction: 实现Abstraction接口,是客户调用的具体产品类。RefinedAbstraction不是必须

的。对于支持多种操作系统的JComponent包来说,JButton和JTable等具体控件就是RefinedAbstraction

,但对于JDBC来说,JDBC Statement/Connection等就是Abstraction,而且直接被客户调用,没有

RefinedAbstraction.

 

Composite

Composite模式就是:在一个对象容器中,可能嵌套子容器,如果所有容器和对象都有类似的接口,基于

所有的对象类型实现统一的接口,以便客户实现遍历或通过一致的接口来操作这些对象。
Component: 定义所有基本对象(Leaf)和复合对象(Composite)的公共接口,并提供缺省实现
Leaf: 基本对象,实现Component定义的公共接口
Composite: 复合对象(对象容器),实现Component定义的公共接口并储存容器中的对象指针
Client: 调用者

 

Decorator

Decorator模式:在某些场景下,必须为被调用类类添加一些额外的职责。为了避免子类继承带来的层次

复杂化,基于被调用类的统一接口,定义专门用来实现额外职责的统一接口,并基于该接口实现不同的额

外职责。
Component: 希望被添加额外职责,但本身还不具备这些能力的被调用类基类
ConcreteComponent: Component的具体实现
Decorator: 具备Component的一切接口,并保存指向Component的指针,除此之外,它可以(但不是必须

)定义了希望被实现的多种额外职责的统一接口和可能的默认实现。客户通过调用Decorator可以实现

Component本身和Decorator额外提供的能力。
ConcreteDecorator: 实现Decorator定义的新接口,对于相同的Component基类,不同的

ConcreteDecorator可提供不同的额外职责。

 

Facade

Facade模式:当子系统中的多个模块都需要向外部提供一些接口时,定义一个统一的Facade类并提供所有

需要向外部暴露的接口,屏蔽外界对内部各个模块和接口的可见性。Facade模式并没有直接用到面向对象

思想。

 

Flyweight

Flyweight模式:当一个对象在系统中存在大量相同的副本时,使用一个工厂类保存对象的唯一拷贝,如

果调用者多次需要同一个对象的多个副本,工厂类返回相同的对象指针。享元模式的可行性基础是从对象

中剥离外部状态,使每一个对象副本完全相同。
Flyweight:对象的统一接口
ConcreteFlyweight:Flyweight的实现,存放于FlyweightFactory中,每个ConcreteFlyweight只有一份

拷贝,可被共享。
UnsharedConcreteFlyweight:Flyweight的实现,存放于FlyweightFactory中,没有被共享。
FlyweightFactory:存放ConcreteFlyweight和UnsharedConcreteFlyweight拷贝的工厂
Client:调用者

 

Proxy

Proxy模式:一些对象希望在被某些调用者时有不同的实现逻辑,通过实现一个和对象有一致接口的

Proxy类,并接管某些接口的实现。对于这些调用者返回Proxy对象,而不是原对象,使调用者在不感知接口差异。

Subject:客户调用的接口,抽象定义了RealSubject的外部接口
RealSubject:原有对象
Proxy:接管RealSubject的某些接口实现逻辑的对象,具有和RealSubject统一的外部接口,其中保存了一个RealSubject的指针

 

各种结构型设计模式的区别


Adapter、Proxy、Bridge、Facade模式的区别
Adapter:在增量开发时,为了不改变已有接口,通过适配层(Target和Adapter),使系统可以以原有的接口来访问新接入的模块/系统。对于新的被访问对象,客户基于原有接口进行访问。
Proxy:在被访问对象不能被直接访问,或需要改变被访问对象的行为时,通过Proxy来访问。对于被访问对象,客户基于和被访问对象一致的接口进行访问,但并不直接访问,而是委托给Proxy。
Facade:一个子系统/模块中存在多个需要暴露给外部的接口,通过定义一个新的接口(类),将被访问接口集中,从而隐藏内部实现。客户基于一个新定义的接口来访问真正的对象。
Bridge:在设计之初,发现一个抽象接口在不同场合下有不同的实现,通过桥接,将接口和实现分离。不同于Adapter,Adapter适用于在后期发现多个接口不一致,需要进行适配。客户基于新定义的一致接口在不同场合下来访问多个不同实现。

 

联系不大的几个设计模式

Decorator:适用于相对独立的为对象添加职责
Composite:适用于容器嵌套场景
FlyWeight:适用于存在大量对象副本

 

结构型设计模式的典型例子


Adapter: 适配设备的不同升级接口
Proxy: 防火墙、快捷方式、游戏外挂截包、网络无法直通时访问代理
Facade: IMAP/PMS SDK
Bridge: Java/Jython执行引擎、JDBC、JComponents
Decorator: ?
Composite: JComponent、Delphi控件
Flyweight: 文本编辑器

原创粉丝点击