设计模式理解与实践
二、结构型模式
桥接模式
1. 概念
将抽象部分与它的实现部分分离,使他们都可以独立地变化。
Decouple an abstraction from its implementation so that the two can vary independently.
2. 理解:
如果在一个继承体系下,有两个纬度上的变化,则需要定义两个不同的接口将两个维度分开,使两者可以独立地扩展,而不会相互影响。其中一个是Abstraction,称为抽象部分的抽象类;另一个是Implementor,称为实现部分的接口。Abstraction持有一个Implementor对象的引用。
如图所示:
bridge.png
组合模式
1. 概念
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象(individual objects)和组合对象(compositions of objects)。
Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
2. 理解
组合模式的参与者
(1) Component
定义组件的公共接口;
(2) Leaf
表示叶子结点对象,叶子结点不再包含子结点对象;
定义和实现叶子结点对象的行为;
(3) Composite
存储子部件(child components);
实现与子部件相关的操作;
(4) Client
通过组件接口来操作组合结构里面的组件对象。
如图所示:
composite.png
装饰者模式
1. 概念
动态地给一个对象添加一些额外的职责。相比子类化,它为提供了一种更加灵活的、扩展功能的方案。
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
如图所示:
decorator.png
外观模式
1. 概念
为一个复杂的子系统提供一个统一的(unified)、更高层(higher-level )的接口,使得访问子系统更加容易一些。
Provide a unified interface to a set of interfaces in a subsystem.
Facade defines a higher-level interface that makes the subsystem easier to use.
享元(flyweight)模式
1. 概念
概念:
运用共享技术高效地(efficiently)支持大量细粒度(fine-grained)的对象。
Use sharing to support large numbers of fine-grained objects efficiently.
flyweight是一个共享对象,它可以同时在多个场景中使用,并且在每个场景中flyweight都可以作为一个独立的对象,这一点与非共享对象的实例没有区别。
有两个概念:内部(intrinsic)状态和外部(extrinsic)状态:
- 内部状态值保存于flyweight实例中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。
-
外部状态值依赖于flyweight的上下文(context),且根据context的变化而变化,因此不可共享。由client实例负责在需要它的时候传递给flyweight实例。
如图所示:
flyweight.png
三、行为模式
3.1 职责链(Chain Of Responsibility)
概念:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Avoid coupling the sender of a request to its receiver by giving more than one
object a chance to handle the request. Chain the receiving objects and pass the
request along the chain until an object handles it.
3.2 命令(Command)
概念:
将一个请求封装为一个对象(包含Receiver和Action),从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。
Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
观察者模式(Observer)
1. 概念
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并自动更新。
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
3.3 策略(Strategy)
概念
定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立与他们的客户而变化。
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
简单来说,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
定义了一系列算法;
对每个算法单独封装;
每个算法可以相互替代。
image.png
访问者(Visitor)
概念:
Represent an operation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements on which it operates.
将对象结构(object structure)和结构中各元素(elements)上执行的操作(operation)分离,使得添加新操作时无须修改对象的结构。
visitor.png