欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之模板模式

程序员文章站 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();
 }
}
相关标签: #设计模式