设计模式之模板模式
程序员文章站
2022-06-13 13:22:57
...
模板模式
模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。
模板模式解决的问题
一些方法通用,却在每一个子类都重新写了这一方法,带来大量重复的代码的问题。相同的部分父类给出统一的模板,不同的部分,子类进行重写。
命令模式模式角色
- AbstractTemplate(抽象类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
- ConcreteTemplate(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
模板抽象类方法类型
- 抽象方法:在抽象类声明、由其具体子类实现。
- 具体方法:在抽象类中声明并实现,在具体子类中可以继承或重写。
- 钩子方法:在抽象类中声明并实现(可以是空的实现),子类视情况进行重写覆盖,一般是逻辑判断方法。
- 模板方法:定义统一模板算法的方法,提供实现方法,子类一般不需要重写。
代码实现
/**
* 抽象模板
*/
public abstract class Game {
/**
* 具体方法
*/
public void initialize(){
System.out.println("game initialize .........");
}
/**
* 抽象方法
*/
abstract void startPlay();
abstract void endPlay();
/**
* 钩子方法
* @return 是否需要结束
*/
boolean isNeedEnd(){
return false;
}
/**
* 模板方法
* final修饰 不允许子类修改
* 每一个游戏先初始化、开始游戏 是否需要结束游戏 根据钩子进行判断
*/
public final void play(){
//初始化游戏
initialize();
//开始游戏
startPlay();
if(isNeedEnd()){
//结束游戏
endPlay();
}
}
}
/**
* 具体模板
* 足球游戏
*/
public class Football extends Game{
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
boolean isNeedEnd() {
return false;
}
}
/**
* 模板测试类
*/
public class TemplateModeTest {
public static void main(String[] args) {
game = new Football();
game.play();
}
}