模板模式
定义:
模板模式是行为型模式的一种。它的定义是一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
优点:
- 封装不变部分,扩展可变部分。
- 提取公共代码,便于维护。
- 行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
为防止恶意操作,一般模板方法都加上 final 关键词。
实例
定义一个Role类,采取西游记中悟空和六耳猕猴的经历来介绍 模板模式。
- Role
public abstract class Role {
/**
* 起步阶段
*/
protected abstract void onStart();
/**
* 成长阶段
*/
protected abstract void onGrow();
/**
* 巅峰阶段
*/
protected abstract void onPeak();
/**
* 结束阶段
*/
protected abstract void onEnd();
/**
* 一生
*/
public final void allLife() {//为防止恶意操作,一般模板方法都加上 final 关键词
onStart();
onGrow();
onPeak();
onEnd();
}
}
- WuKong
public class WuKong extends Role {
@Override
protected void onStart() {
System.out.println("拜师学艺");
}
@Override
protected void onGrow() {
System.out.println("大闹天宫");
}
@Override
protected void onPeak() {
System.out.println("西天取经");
}
@Override
protected void onEnd() {
System.out.println("斗战圣佛");
}
}
- SixEarMonkey
public class SixEarMonkey extends WuKong {
@Override
protected void onPeak() {
System.out.println("六耳猕猴取代悟空西天取经");
}
}
- main方法中实现
public class MyClass {
public static void main(String[] args) {
Role role = new WuKong();
role.allLife();
System.out.println("--------------");
role = new SixEarMonkey();
role.allLife();
}
}
打印结果:
拜师学艺
大闹天宫
西天取经
斗战圣佛
--------------
拜师学艺
大闹天宫
六耳猕猴取代悟空西天取经
斗战圣佛