设计模式 | 模板方法模式(template method)

时间:2021-02-25 05:27:15

定义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

结构:(书中图,侵删)

设计模式 | 模板方法模式(template method)
一个定义整体框架的父类
若干不同具体实现的子类

实例:

我瞬间就想到了很多RPG游戏。
不同职业在新手村完成任务,最多就是打的怪名字不一样、不同职业奖励的装备不一样子类的。
基本上都是一个套路。
 
接下来用代码实现:
为了代码简洁,我就设置一个任务,以及两个职业:战士、法师。
 
新手村任务框架类:
package designpattern.templatemethod;

public abstract class NoviceVillage {
public void Task1() {
System.out.println("你好,勇士。请帮我杀掉10个" + Task1Aim());
}
public void underWay() {
System.out.println("任务进行中...");
}
public void Task1Reward() {
System.out.println("太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、" + Task1RewardWeapon());
} abstract String Task1Aim(); abstract String Task1RewardWeapon();
}
战士的任务类:
package designpattern.templatemethod;

public class NoviceVillageWarrior extends NoviceVillage{

    @Override
String Task1Aim() {
return "老虎怪";
} @Override
String Task1RewardWeapon() {
return "新手巨剑*1";
} }
法师的任务类:
package designpattern.templatemethod;

public class NoviceVillageWizard extends NoviceVillage{

    @Override
String Task1Aim() {
return "猴子精";
} @Override
String Task1RewardWeapon() {
return "新手法杖*1";
} }
客户端:
package designpattern.templatemethod;

public class Client {
public static void main(String[] args) {
// 战士
NoviceVillage noviceVillageWarrior = new NoviceVillageWarrior();
noviceVillageWarrior.Task1();
noviceVillageWarrior.underWay();
noviceVillageWarrior.Task1Reward(); System.out.println("=================================="); // 法师
NoviceVillage noviceVillageWizard = new NoviceVillageWizard();
noviceVillageWizard.Task1();
noviceVillageWizard.underWay();
noviceVillageWizard.Task1Reward();
}
}

输出结果:

你好,勇士。请帮我杀掉10个老虎怪
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手巨剑*1
==================================
你好,勇士。请帮我杀掉10个猴子精
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手法杖*1

总结:

感觉这个设计模式在平时多多少少都见到或者用到过,只是不知道这也是一个设计模式。
这个设计模式的精髓就是整体的框架是不变的,但是里面某些细节会有不同,这时候就需要用到模板方法设计模式。
可以大大提高代码的复用性,以及减少代码的大面积重复。