创建模式
Singleton(单例)
Prototype(原型)
Builder(建造者)
Factory(工厂)
行为模式
Visitor
- UML
-
- 角色
- 1.IVisitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和
参数标识了发送访问请求给具休访问者的具休元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。 - 2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。
- 3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
- 4.ConcreteElement 具体元素,实现了抽象元素(Element)所定义的接受操作接口。
- 5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。它具备以下特性:
能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个
复合对象或者一个聚集(如一个列表或无序集合)。
- 1.IVisitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和
Interpreter(解释器)
Mediator(中介者)
- UML
-
- 角色
- 1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
- 2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
- 3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
Strategy(策略)
- UML
-
- 角色
- Strategy类:定义了策略接口,用来约束一系列具体的策略算法。Context使用这个接口调用具体策略实现定义的算法。
- ConcreteStrategy:具体的策略实现,也就是具体的算法实现
- Context:上下文,负责和具体的策略类交互,维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问他的数据。
- 优缺点
- 相关算法系列、提供了可以替换继承关系的办法、消除了一些if else语句、实现的选择
- 客户端必须知道所有的策略类,并自行决定使用那一个策略类、Strategy和Context之间的通信开销、策略模式将导致产生很多策略类
State(状态)
- UML
-
- 角色
- State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
- ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为
- Context类,维护一个ContcreteState子类的实例,这个实例定义当前的状态
- 把Context交给子类来控制,Context保存着下一个状态的引用,子类来更改这个引用
Command(命令)
- UML
- 角色
- 客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者
- 命令(Command)角色:声明了一个给所有具体命令类的抽象接口
- 具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的响应操作。execute()执行方法
- 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
- 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和请求的方法叫做行动方法。
Chain of Responsibility(职责链)
- UML
-
- 角色
- 抽象处理者(Handler
Observer(观察者)
- UML
- 角色
- Subject类,抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。
- Observer类,抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己
- ConcreteSubject类,具体主题角色,在内部状态改变时,给所有等级过的观察者发出通知。
- ConcreteObserver类,具体观察者角色,实现抽象观察者角色所需要的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
- 优缺点
- 观察者和被观察者之间简历一个抽象的耦合,观察者模式支持广播通讯。
- 如果观察者过多,将所有的观察者都通知到会话费很多时间;如果被观察者之间有循环依赖,会导致系统崩溃;如果是线程异步投递,系统必须保证投递是以自恰的方式进行的;寡女哈着不知道所观察的对象是怎么发生变化的。
Memento(备忘机制)
- UML
-
- 角色
- Originator类,当前操作对象,添加setMemento createMemento方法
- Memento类,作为保存对象的备忘录物件
- Caretaker类,保留原发者所创造的备忘录物件
- 优缺点
- 在需要提供保存、恢复对象状态的类中,必须提供两个方法:.保存对象当前状态方法:将对象自身(this)作为参数传入,创建备忘录。.恢复对象之前状态的方法:取出备忘录/接收一个备忘录对象,从中获取对象之前的状态
Template(模版)
- UML
-
- 角色
- 具体类靠抽象类中的模板方法来完成算法中不变的部分。
-
模板方法导致一种反向的控制结构,即父类调用子类的方法。模板方法调用下列类型的操作: 具体的操作,具体的 AbstractClass 的操作,原语操作,钩子操作等。
结构模式
Flyweight(享元)
- UML
-
- 角色
- Flyweight接口(抽象类):定义了一个可共享的元类
- Flyweight实现类:实现了元类中的操作,而且可能会提供一个用于保存内部状态(共享属性)的空间
- Flyweight Factory:创建Flyweight的工厂类,创建后将其保存到FlyweightPool中
- Flyweight Pool:缓冲Flyweight对象的池,通常包含在工厂类中(Hashtable)
Bridge
- UML
-
- 角色
- 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用
- 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
Decorator(装饰)
- UML
-
- 角色
- Component抽象接口类,定义 一个接口,可以给这些对象动态地添加职责。
- ConcreteComponent,定义一个对象,可以给这个对象添加一些职责。
- Decorator,维持一个只想Component对象的指针,并定义一个与Component接口一致的接口,将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。
- ConcreteDecorator,像组件添加职责
Composite(组合)
- UML
-
- 角色
- 抽象构建角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理component子部件。
- 树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为
- 树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
- 客户角色(Client):通过component接口操纵组合部件的对象。
Adapter(适配器)
- UML(类适配器、对象适配器)
-
-
- 角色
Proxy(代理)
- UML
-
- 角色
- 抽象角色:声明真实对象和代理对象的共同接口;
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 真实角色:代理角色所代表的真实对象,使我们最终要引用的对象。
- 实用性
- 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用 Proxy模式。下面是一些可以使用Proxy模式常见情况:
- 1) 远程代理(Remote Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
- 2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
- 3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
- 4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
- 5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
Facade(外观)
- UML
-