闲话不多说,先从Template Method开始。
对于Template Methods,官方(指GoF书中)的定义的是:"Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. "
简单用中文来说,就是将某个方法中的一些子操作(通过将子操作定义为虚函数的形式)保留,留待该方法所在类子类来实现。简单的示例图:
其中,PrimitiveOperation就是要留待子类实现的部分操作。这个设计模式看似没有很复杂的内容,但是有两点需要记住:
首先是如一本书中提到的"classes in a hierarchy share the outline of an algorithm in an abstract superclass",具体怎么应用要看理解,由于我的应用经验也不是很足,这里无法做出非常清晰的解释
还有一点是Template Method在 "to implenment similar algorithms in more than one method" 时也有很好的用法。这个用法的一个例子就是在与Factory Method结合的时候(这个应用有些类似基于Factory Method再应用一次多态,当然,这是笔者个人的理解)。具体可以去看《Design Pattern Java Workbook》,里面有不错的例子。
简单介绍完Template Method,接下来看一下State。如它的名字所说,这个模式与程序状态有关。GoF的定义为: "Allow an object to alter its behavior when its internal state changes. The object will appear to change its class".
在分析以前看一下图例:
我认为对State的理解有两个,一个是GoF提出State的时候的意思,即,使对象状态的改变可以动态改变其行为;还有一个是我们在实践中体会到的,即在某个对象状态变化十分复杂的时候,将其每个状态都封装成一个类,实现if-else的功能。
接下来是Strategy的一些理解。GoF的定义为: "Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.". 以笔者的观点看来,这个模式的主要作用是,对于程序提供的多个可能的策略,利用多态,这个模式可以动态的选择其中的某一策略。看一下图:
图里面已经比较清楚,笔者将自己认为的几点说一下:
一是对于具体的策略(如ConcreteStrategyA),有时需要采用Singleton模式
二是在策略很多很复杂时,在具体的策略类(如ConcreteStrategyA)中,我们往往不直接将策略写在AlgorithmInterface里,而是应用Flyweitht模式,抽取某些可重用的部分。
以上是笔者对三个模式的一些理解,可以看到,三者的区别是明显的,但又不是完全不同(废话)。也许正确的使用全凭乎一个感觉,即经验。而通过对这三个模式的学习,笔者认为自己对多态有了更深入的理解,希望对看这片文章的人也有所帮助。