模板方法模式(Template Method Pattern)是如此简单,定义如下: Define the skeleton of an algorithm in an operation,deferring somes teps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法某些特定步骤
如类图定义如图所示:
模板方法模式确实非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式。其中AbstractClass叫做抽象模板,它的方法分为两类:
基本方法
基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
模板方法
可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。 注意 为了防止恶意的操作,> 一般模板方法都加上final关键字,不允许被覆写。
抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。
我们有不同的任务需要执行,抽象代码如下:
// 定义抽象类abstract class Task {abstract void start();abstract void exec();abstract void stop();abstract void runTask();}
分别实现 ReadTask & WriteTask
class ReadTask extends Task {@Overridevoid start() {System.out.println("开始阅读");}@Overridevoid exec() {System.out.println("正在阅读");}@Overridevoid stop() {System.out.println("停止阅读");}@Overridevoid runTask() {start();exec();stop();}}class WriteTask extends Task {@Overridevoid start() {System.out.println("开始写作");}@Overridevoid exec() {System.out.println("正在写作");}@Overridevoid stop() {System.out.println("结束写作");}@Overridevoid runTask() {start();exec();stop();}}
创建这两个任务并且运行,代码以及输出结果如下:
public static void main(String[] args) {Task readTask = new ReadTask();readTask.runTask();Task writeTask = new WriteTask();writeTask.runTask();}开始阅读正在阅读停止阅读开始写作正在写作结束写作
1.1、 代码分析
上面的代码中,我们发现runTask 的到吗是重复的,我们使用下面的类图实现。
// 定义抽象类abstract static class Task {abstract void start();abstract void exec();abstract void stop();final void runTask() {start();exec();stop();}}
修改类的类图如下:
