模板模式(Template Pattern)

模板模式

一、介绍

  模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

  • 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
  • 何时使用:有一些通用的方法。
  • 如何解决:将这些通用算法抽象出来。
  • 关键代码:在抽象类实现,其他步骤在子类实现。

二、优缺点

2.1 优点

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

2.2 缺点

  1. 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

三、使用场景

  1. 有多个子类共有的方法,且逻辑相同。
  2. 重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都要加上final关键词。

四、具体实现

1、创建一个抽象类,它的模板方法被设置为 final。

/**
 * 模板设计模式 game抽象类
 *
 * @author zt1994 2021/4/3 15:41
 */
public abstract class AbstractGame {

    /**
     * 初始化游戏
     */
    abstract void initialize();

    /**
     * 开始游戏
     */
    abstract void startPlay();

    /**
     * 结束游戏
     */
    abstract void endPlay();

    /**
     * 模板 final实现
     */
    public final void play() {
        initialize();

        startPlay();

        endPlay();
    }
}

2、创建扩展了上述类的实体类。

/**
 * Cricket实体类
 *
 * @author zt1994 2021/4/3 15:42
 */
public class Cricket extends AbstractGame {

    @Override
    void initialize() {
        System.out.println("Cricket Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Cricket Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Cricket Game Finished!");
    }
}

/**
 * Football实体类
 *
 * @author zt1994 2021/4/3 15:43
 */
public class Football extends AbstractGame {

    @Override
    void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }
}

3、使用 Game 的模板方法 play() 来演示游戏的定义方式。

/**
 * 模板模式测试类
 *
 * @author zt1994 2021/4/3 15:44
 */
public class TemplatePatternTest {

    public static void main(String[] args) {
        AbstractGame game = new Cricket();
        game.play();
        System.out.println("------");
        game = new Football();
        game.play();
    }
}

4、测试结果

Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
------
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!

posted @ 2023-05-17 22:36  ZT1994  阅读(14)  评论(0编辑  收藏  举报