上午题 #9 设计模式
总览
- 工厂单例建原型: 创建型模式
- 世代外接享组合: 结构性模式
- 剩下的(其他的)都是行为型模式共11个
创建型模式(5个):
- 工厂方法 (创建型类)
- 抽象工厂方法 (创建型对象)
- 单例模式 (创建型对象)
- 建造者模式 (创建型对象)
- 原型模式 (创建型对象)
结构性模式(7种):
- 装饰器模式 (结构型对象)
- 适配器模式 特殊: 既是结构型对象模式 ,也是结构型类模式
- 代理模式 (结构型对象)
- 外观者模式 (结构型对象)
- 桥接模式 (结构型对象)
- 享元模式 (结构型对象)
- 组合模式 (结构型对象)
行为型模式(11种)
- 策略模式 (行为型对象)
- 模板方法模式 (行为型类模式)
- 观察者模式 (行为型对象)
- 迭代子模式 (行为型对象)
- 责任链模式 (行为型对象)
- 命令模式 (行为型对象)
- 备忘录模式 (行为型对象)
- 状态模式 (行为型对象)
- 访问者模式 (行为型对象)
- 中介者模式 (行为型对象)
- 解释器模式 (行为型类模式)
单例模式 Singleton
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点
用途
工厂方法模式 Factory
抽象工厂模式 Abstract Factory
特点
- 创建多个产品族
- 多个抽象产品接口
- 1个工厂级产生多个产品
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
生成器模式(Builder)/建造者模式
特点
Builder模式适用于:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构造过程必须允许被构造的对象有不同的表示时
原型模式
单例模式
适配器模式 Adapter
转换原接口 得到 兼容的接口
桥接模式 Bridge
意图:
将抽象部分与实现部分分离, 使他们可以独立变化
英文单词关键词:OperationImp
Bridge模式适用于:
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
- 有许多类要生成的类层次结构。
- 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
组合模式 Composite
意图
将对象组合成树型结构以表示“部分-整体”的的层次结构。Composite使 得用户对单个对象 和组合对象的使用具有一致性。
适用性
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
分析:
- Component:作为抽象基类,定义了所有部件(包括叶子
Leaf
和组合Composite
)的通用接口(如add()
、remove()
)。 Composite
是Component
的子类,实现有子部件的具体行为。Leaf
是叶子节点,不包含子部件(可能抛出“不支持操作”异常)
装配器模式 Decorator
意图
动态地给对象添加一些职责, 比生成子类更加灵活
其中: Component定义一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent定义一个对象,可以给这个对象添加一些职责。 Decorator 维持一个指向Component 对象的指针,并定义一个与 Component 接口一致 的接口。 ConcreteDecorator向组件添加职责。
适用性
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤销的职责。
- 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支 持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,
- 由于类定义被隐藏,或类定义不能用于生成子类。
外观模式 Facade
意图
定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用
将一系列对象加以包装以简化接口
结构
- Facade知道哪些子系统类负责处理请求;将客户的请求代理给适当的子系统对象。不要混淆认为代理模式
- Subsystem classes实现子系统的功能;处理有Facade对象指派的任务;没有Facade的 任何相关信息,即没有指向Facade的指针。
享元模式 Flyweight
意图
运用共享技术有效地支持大量细粒度的对象
结构
代理模式 Proxy
意图
通过提供相同的接口,为其他对象提供代理以控制这个对象的访问
结构
责任链模式 Chain Of Reponsibility
意图
使多个对象都有机会处理请求,从而避免发送者和请求者之间的耦合关系.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
结构
- Handler定义一个处理请求的接口;(可选)实现后继链。
- ConcreteHandler处理它所负责的请求;可访问它的后继者;如果可处理该请求,就处 理它,否则将该请求转发给后继者。
- Client向链上的具体处理者(ConcreteHandler)对象提交请求。
命令模式 Command
意图
将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作
类图关键英文单词 Command、Execute
适用于:
(1)抽象出待执行的动作以参数化某对象。
(2)在不同的时刻指定、排列和执行请求。
(3)支持取消操作。
(4)支持修改日志。
(5)用构建在原语操作上的高层操作构造一个系统。
结构
- Command 声明执行操作的接口。
- ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实 现Execute。
- Client 创建一个具体命令对象并设定它的接收者。
- Invoker 要求该命令执行这个请求。
- Receiver 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
解释器模式 Expression
意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来 解释语言中的句子。
结构
迭代器模式 Iterator
意图
提供一种方法顺序访问一个聚合对象中的各个元素,且不能暴漏该对象的内部表示.
结构
- Iterator(迭代器)定义访问和遍历元素的接口。
- ConcreteIterator(具体迭代器)实现迭代器接口;对该聚合遍历时跟踪当前位置。
- Aggregate(聚合)定义创建相应迭代器对象的接口。
- ConcreteAggregate(具体聚合)实现创建相应选代器的接口,该操作返回ConcreteIterator 的一个适当的实例。
中介者模式 Meditor
意图
用一个对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而 使其耦合松散,而且可以独立地改变它们之间的交互。
结构
适用于
备忘录模式 Memento
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态
结构
观察者模式 Observer
意图
定义对象间一对多的关系,当一个对象的状态发生变化时,所有依赖它的对象都能得到通知并自动更新
结构
状态模式 state
意图
允许一个对象在其内部状态改变时改变它的行为.对象看起来修改了他的类
结构
适用性
一个对象的行为决定于它的状态,并且时刻根据它的状态改变它的行为
策略模式
意图
定义一系列的算法,并把他们封装起来,使他们可以相互替换.
结构
适用性
模板方法模式 Template Method
意图
定义1个算法中的算法骨架,而将一些步骤延迟到子类.使得子类可以不修改1个算法的结构即可重新定义该算法的某些特定步骤
结构
适用性
访问者模式 Visitor
意图
表示1个作用于某个对象中的各元素操作.它允许在不改变各元素的类的前提下定义作用于这些元素的新操作
结构
适用性
需要对一个对象结构中的对象进行很多不同的并且不相关的操作