@mSolo
2015-05-28T17:41:25.000000Z
字数 4093
阅读 2155
设计模式
出处:《设计模式》
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类;
- 适用性
- 一个系统要独立于它的产品的的创建、组合和表示时
- 一个系统要由多个产品系列中的一个来配置时
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时
- 当你提供一个产品类库,而只是显示它们的接口而不是实现时
- 参与者
- AbstractFactory
声明一个创建抽象产品对象的操作接口- ConcreteFactory
实现创建具体产品对象的操作- AbstractProduct
为一类产品对象声明一个接口- ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象,并实现AbstarctProduct接口- Client
仅使用由 AbstractFactory 和 AbstractProduct 类声明的接口- 协作
- 通常在运行时刻创建一个 ConcreteFactory 类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂
- AbstractFactory 将产品对象的创建延迟到它的 ConcreteFactory 子类
- 结构
- 相关设计模式:Prototype、Singleton
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
- 适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构造过程必须允许被构造的对象有不同的表示时
- 参与者
- Builder
为创建一个 Product 对象的各个部件指定抽象接口- ConcreteBuilder
a) 实现 Builder 的接口以构造和装配该产品的各个部件
b) 定义并明确它所创建的表示
c) 提供一个检索产品的接口- Director
构造一个使用 Builder 接口的对象- Product
a) 表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程
b) 包含定义组成部件的类,包括将这些部件装配成最终产品的接口- 协作
- 客户创建 Director 对象,并用它所想要的 Builder 对象进行配置
- 一旦产品部件被生成,导向器就会通知生成器
- 生成器处理导向器的请求,并将部件添加到该产品中
- 客户从生成器中检索产品
- 结构
- 相关设计模式:Composite
- 定义一个用于创建对象的接口,该模式使一个类的实例化延迟到其子类;
- 适用性
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
- 参与者
- Product(Document)
定义工厂方法所创建的对象的接口- ConcreteProduct(MyDocument)
实现 Product 接口- Creator(Application)
声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象
可以调用工厂方法以创建一个Product对象。- 协作
- Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
- 结构
- 相关设计模式:
- Abstract Factory
- 工厂方法在Template Methods中被调用
- Prototypes不需要创建Creator的子类。但是,它们通常要求一个针对Product类的Initialize操作。Creator使用Initialize来初始化对象
- 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求;
将这些请求连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。- 适用性
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;
- 可处理一个请求的对象集合应被动态指定;
- 参与者
- Handler
定义一个处理请求的接口;(可选:实现后继链)- ConcreteHandler
处理它所负责的请求;
可访问它的后继者;
如果可处理该请求,就处理之;否则将该请求转发给它的后继者;- Client
向链上的具体处理者对象提交请求;- 协作
- 当客户提交一个请求时,请求沿链传递直至有一个ConcreteHandler对象负责处理它。
- 结构
- 相关设计模式
- 将一个请求封装为一个对象,从而使你可使用不同的请求对客户进行参数化;
比如对请求排队或记录请求日志,以及支持可取消的操作;- 适用性
- 像上面讨论的MenuItem对象那样,抽象出待执行的动作以参数化某对象。你可用过程语言中的回调函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command模式是回调机制的一个面向对象的替代品;
- 在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求;
- 支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”;
- 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加转载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们;
- 用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务的信息系统中很常见。一个事务封装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可用用一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
- 参与者
- Command
声明执行操作的接口;- ConcreteCommand
将一个接收者对象绑定于一个动作;
调用接收者相应的操作,以实现Execute;- Client
创建一个具体命令对象并设定它的接收者;- Invoker
要求该命令执行这个请求;- Receiver
知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者;- 协作
- Client创建一个ConcreteCommand对象并指定它的Receiver对象;
- 某Invoker对象存储该ConcreteCommand对象;
- 该Invoker通过调用Command对象的Execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令;
- ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求;
- 结构
- 相关设计模式
- Composite模式,可被用来实现宏命令;
- Memento模式,可用来保持某个状态,命令用这一状态来取消它的效果;
- 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。使得算法的变化可独立于使用它的客户。