第十三章 COMMAND模式和ACTIVE OBJECT模式
COMMAND模式:
该模式仅由一个具有唯一方法的接口。它只封装了一个没有任何变量的函数。
通过对命令概率的封装,该模式解除了系统的逻辑互连关系和实践连接的设备之间的耦合。
另一个常见用法:创建和执行食物操作。
COMMAND模式中do()方法:记住它所执行的操作的细节;
增加了undo()方法:取消do()方法中执行的操作,并把系统回复到原先的状态。
ACTIVE OBJECT模式
ACTIVE OBJECT模式是最好使用COMMAND模式的地方之一。是实现多线程控制的技术。
采用ACTIVE OBJECT模式的变体(Variations)去构建多线程系统已经是并一个常见的实践。此类线程被称为run-to-completion任务(RTC)。RTC意味着Command实例不会阻塞。RTC共享同一个运行时堆栈。
COMMAND模式可以应用于多种不同的用途:数据库事务操作、设备控制、多线程核心以及GUI的do/undo管理。
第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托
优先使用对象组合(Object Composition)而不是类继承(Class Inheritance).
本章两个模式,归纳了继承和委托之间的区别。TEMPLATE METHOD模式和STRATEGY模式所需要解决的问题时类似的,常常可互换使用。
TEMPLATE METHOD模式:使用继承来解决问题。
STRATEGY模式:使用委托来解决问题。
TEMPLATE METHOD模式和STRATEGY模式:都可以分离通用的算法和具体的上下文。
为遵循依赖倒置原则(DIP):要确保通用的算法不要依赖于具体的实现。通用的算法和具体的实现都依赖于抽象。
TEMPLATE METHOD模式
该模式:把所有通用代码放入一个抽象基类(Abstract Base Class)的实现方法中。这个实现方法:完成了这个通用算法,但是将所有的实现细节都交付给该基类的抽象方法。
STRATEGY模式
该模式:使用一种非常不同的方法来倒置通用算法和具体实现之间的依赖关系。
不将通用的应用算法放进一个抽象基类中,而是将它放进具体类中。
把通用算法必须调用的抽象方法定义在A接口中。
从这个接口A的派生出strateg类,并把它传给具体类中。之后,具体类就可以把具体工作委托给这个接口A去完成。
TEMPLATE METHOD模式和STRATEGY模式:都可以用来分离高层的算法和低层的具体实现细节。允许高层的算法独立于它的具体实现袭击重用。
STRATEGY模式:也允许具体实现细节独立于高层的算法重用。
第十五章 FACADE模式和MEDIATOR模式
这章的两个模式有着共同的目的:它们都把某种策略施加到另外一组对象上。
FACADE模式:从上面施加策略,使用时明显且受限的。
MEDIATOR模式:从下面施加策略,使用则是不明显且不受限制的。
FACADE模式
该模式:当想要为一组具体复杂且全面的接口的对象提供一个简单且特定的接口时,运用。
Facades通常是约定的关注点,每个人都同意去使用该facade而不是隐藏于其下的对象。
MEDIATOR模式
该模式:以隐藏且不受限的方法来施加它的策略。如果策略隐藏且有针对性,用MEDIATOR模式是更好的选择。
Mediator则对用户是隐藏的,它的策略是既成事实的而不是一项约定事务。
第十六章 SINGLETON模式和MONOSTATE模式
SINGLETON模式
该模式:实例是通过公有的静态方法Instance访问的。即使被多次调用,每次返回的都是指向完全相同的实例的引用。
SINGLETON模式的好处
- 跨平台:使用合适的中间件;
- 适用于任何类:只需把一个类的构造函数变成私有的,且在其中增加相应的静态函数和变量,就可把这个类变成SINGLETON;
- 可以透过派生创建:给定一个类,可以创建它的一个SINGLETON子类;
- 延迟求值:如果SINGLETON从未使用过,那就决不会创建它。
SINGLETON模式的代价
- 摧毁方法为定义:没有好的方法去Destroy;
- 不能继承:从SINGLETON类派生出来的类并不是SINGLETON。如要成为SINGLETON,必须要增加所需的静态函数和变量;
- 效率问题:每次调用Instance方法都会执行if语句。
- 不透明性:SINGLETON的使用者指导他们正在使用一个SINGLETON,因为他们必须要调用instance方法。
MONOSTATE模式
该模式:是另外一种获取对象单一性的方法。
** MONOSTATE模式的好处**
- 透明性:使用Monostate对象和使用常规(Regular)对象没什么区别。使用者不需要知道对象是MONOSTATE。
- 可派生性:MONOSTATE的派生类都是MONOSTATE,他们共享相同的静态变量。
- 多态性:由于MONOSTATE的方法不是静态的,可在派生类中覆写它们。
** MONOSTATE模式的代价**
- 不可转换性:不能透过派生把常规类转换成MONOSTATE类。
- 效率问题:MONOSTATE是真正的对象,导致很多的创建和摧毁开销。
- 内存占用:即使从未使用MONOSTATE,它的变量也要占据内存空间。
- 平台局限性:MONOSTATE不能跨多个JVM或多个平台工作。
SINGLETON模式:强制结构上的单一性,它放置创建多个对象实例;
MONOSTATE模式:强制行为上的单一性,而没有强加结构方面的限制。
MONOSTATE类的测试用例对SINGLETON类是有效的,但是SINGLETON的测试用例不适用于MONOSTATE类。
SINGLETON模式:使用私有构造函数,一个静态变量,以及一个静态方法对实例化进行控制和限制。
MONOSTATE模式:只是简单地把对象的所有变量变成静态的。
如果希望透过派生类去约束一个现存类,并且不介意它的所有调用者都必须要调用instance()方法来获取访问权,用SINGLETON模式最适合。
如果希望类的单一性本质对使用者透明,或希望使用单一对象的多态派生对象,用MONOSTATE模式最适合。
第十七章 NULL OBJECT模式
该模式:消除对null进行检查的需要,并且有助于简化代码。
通过NULL类实现了接口中的所有方法,但方法中“什么也没做”。“什么也没做”的含意和具体的方法有关。
网友评论