设计模式之模板方法模式(Java实现)
Template Method(模板方法)
一、意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二、结构
模板方法模式的结构图如图7-47所示。 其中: • AbstractClass (抽象类)定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定一个算法的骨架,该模板方法不仅调用原语操作, 也调用定义在AbstractClass或其他对象中的操作。 ConcreteClass (具体类)实现原语操作以完成算法中与特定子类相关的步骤。
三、适用性
Template Method模式适用于: • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 • 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。 • 控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。
四、实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。Template,我们的演示类使用 Game 来演示模板模式的用法。
首先 创建一个抽象类,它的模板方法被设置为 final。
abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); //模板 public final void play(){ //初始化游戏 initialize(); //开始游戏 startPlay(); //结束游戏 endPlay(); } }
然后 创建扩展了上述类的实体类。
class Cricket extends Game { @Override void initialize() { System.out.println("板球游戏初始化... Start playing."); } @Override void startPlay() { System.out.println("板球游戏开始... Enjoy the game!"); } @Override void endPlay() { System.out.println("板球游戏结束!Over..."); } } class Football extends Game { @Override void initialize() { System.out.println("足球游戏初始化... Start playing."); } @Override void startPlay() { System.out.println("足球游戏开始... Enjoy the game!"); } @Override void endPlay() { System.out.println("足球游戏结束!Over..."); } }
最后 使用 Game 的模板方法 play() 来演示游戏的定义方式。
public class Template { public static void main(String[] args) { // TODO Auto-generated method stub Game game = new Cricket(); game.play(); System.out.println("==================================="); game = new Football(); game.play(); } }
运行结果: