模板方法模式(Template Method)
模板方法模式将算法流程与算法具体实现相分离的结构.
首先, 定义一个抽象类, 抽象类中有一个不可重写的final方法, 这个方法中封装核心的算法流程, 但这个流程中只有方法调用, 没有具体实现.
具体的方法实现由子类完成, 一些方法是抽象方法, 子类必须实现, 另一些方法则是钩子方法, 子类选择性实现.
代码示例:
java
// 模板方法类, 只定义核心逻辑, 提供算法框架, 不进行具体实现
abstract class Hero {
// 这个createHero方法中定义固定的逻辑, 所有子类都遵循这里的顺序
// 有些方法子类必须实现, 也有部分钩子方法子类可选择性实现
public final void createHero() {
try {
System.out.print("身形: ");
createBody();
System.out.print("肌肉: ");
if (createMuscles()) {
System.out.println(" 身形健硕, 极其勇猛");
} else {
System.out.println("无");
}
System.out.print("武器: ");
if (createWeapon()) {
System.out.println(" 真理面前, 众生平等");
} else {
System.out.println("没有武器");
}
System.out.print("技能: ");
createSkill();
System.out.print("头戴: ");
createHat();
System.out.print("名号: ");
sayName();
} catch (Exception e) {
System.out.println("[Exception] " + e.getMessage());
}
}
abstract void createHat();
abstract void createSkill();
abstract void createBody();
// 钩子方法
boolean createMuscles() {
return false;
}
boolean createWeapon() {
return false;
}
abstract void sayName();
}
class ZhangFei extends Hero {
@Override
void createHat() {
System.out.println("黑帅盔");
}
@Override
void createBody() {
System.out.println("身高七尺,皮肤黝黑");
}
@Override
void createSkill() {
System.out.println("声如洪钟, 骁勇善战");
}
@Override
void sayName() {
System.out.println("燕人张飞张翼德");
}
@Override
boolean createMuscles() {
System.out.println("肌肉发达, 耐力非比寻常");
return true;
}
@Override
boolean createWeapon() {
System.out.println("丈八蛇矛");
return true;
}
}
class LvBu extends Hero {
@Override
void createHat() {
System.out.println("紫金冠");
}
@Override
void createBody() {
System.out.println("身高八尺,英俊无比");
}
@Override
void createSkill() {
System.out.println("辕门射戟神技, 战力非凡");
}
@Override
void sayName() {
System.out.println("九原吕布吕奉先");
}
@Override
boolean createMuscles() {
System.out.println("肌肉结实,身材魁梧");
return true;
}
@Override
boolean createWeapon() {
System.out.println("方天画戟");
return true;
}
}
调用及执行:
java
public class TemplateMethodPattern {
public static void main(String[] args) {
ZhangFei zhangfei = new ZhangFei();
zhangfei.createHero();
System.out.println("=================");
LvBu lvbu = new LvBu();
lvbu.createHero();
}
}
执行结果:
身形: 身高七尺,皮肤黝黑
肌肉: 肌肉发达, 耐力非比寻常
身形健硕, 极其勇猛
武器: 丈八蛇矛
真理面前, 众生平等
技能: 声如洪钟, 骁勇善战
头戴: 黑帅盔
名号: 燕人张飞张翼德
=================
身形: 身高八尺,英俊无比
肌肉: 肌肉结实,身材魁梧
身形健硕, 极其勇猛
武器: 方天画戟
真理面前, 众生平等
技能: 辕门射戟神技, 战力非凡
头戴: 紫金冠
名号: 九原吕布吕奉先
模板方法能够让子类只实现算法的局部功能, 而不是去实现整个算法结构, 在实际开发中有效分离算法与实现.
在思考一个算法时, 考虑有哪些共同的步骤是在各种情况中反复出现的, 把他们都分步抽出来,
然后各种情况的实现类去实现这些有差异的部分