最近在看设计模式之禅,书的内容以讲故事的方式介绍了设计模式,强力推荐。
以下是个人对于模板方法模式的理解
/*
* 模板方法模式
* 优点
* 封装不变部分,扩展可变部分
* 提取公共部分代码,便于维护
* 行为由父类控制,子类实现
*
*/
public class MyMain {
public static void main(String[] args) {
new carA().test();
new carB().test();
}
}
//核心
//定义一个抽象的车模型类(抽象模板)
abstract class carModel{
//车的基本抽象方法:启动
protected abstract void start();
//车的基本抽象方法:暂停
protected abstract void stop();
//车的基本抽象方法:奔跑
protected abstract void run();
//车的模板方法:测试 ,用于测试车模型的基本方法(既子类提取的公共方法:测试)
protected void test() {
System.out.println("开始测试车模型:");
this.start();
if (isRun()) {
this.run();
}
this.stop();
System.out.println("测试结算。");
};
//钩子方法 默认测试时车是要奔跑起来的(子类重写该方法,可用于控制测试时是否要奔跑)
protected boolean isRun() {
return true;
}
}
//继承车模型的A类车模型(具体模板)
class carA extends carModel{
//实现车模型的基本方法
@Override
protected void start() {
System.out.println("A类车启动");
}
@Override
protected void stop() {
System.out.println("A类车暂停");
}
@Override
protected void run() {
System.out.println("A类车奔跑");
}
//重写钩子方法,使A类车测试时不用奔跑起来
@Override
protected boolean isRun() {
return false;
}
}
//继承车模型的B类车模型(具体模板)
class carB extends carModel{
@Override
protected void start() {
System.out.println("B类车启动");
}
@Override
protected void stop() {
System.out.println("B类车暂停");
}
@Override
protected void run() {
System.out.println("B类车奔跑");
}
}