模板模式(TemplatePattern)

模板模式

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

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

优缺点

优点
  • 封装不变部分,扩展可变部分。
  • 提取公共代码,便于维护。
  • 行为由父类控制,子类实现。
缺点
  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

开源框架中模板模式应用

SpringBoot

Spring refresh 流程,refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作,它的内部主要会调用 12 个方法。

其中postProcessBeanFactory()、onRefresh()是空实现,留给子类扩展。

在这里插入图片描述

public void refresh() throws BeansException, IllegalStateException {
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var9) {
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }

                this.destroyBeans();
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }

        }
    }

应用实例

  • 王者荣耀:游戏初始化、开始游戏、结束游戏。
  • 和平精英:游戏初始化、开始游戏、结束游戏。
  • 西游记81难:81难顺序就是模板,提前设置好的,只是每一难的妖怪不一样。

代码实现

  1. 创建一个游戏抽象类,它的模板方法被设置为 final。
public abstract class Game {
    // 初始化游戏
    abstract void init();
    // 开始游戏
    abstract void start();
    // 结束游戏
    abstract void end();

    public final void play(){ //防止子类重写模板方法
        // 初始化游戏
        init();
        // 开始游戏
        start();
        // 结束游戏
        end();
    }
}
  1. 创建上述抽象类的子类(王者和吃鸡)。
public class KingGame extends Game{
    @Override
    void init() {
        System.out.println("KingGame init...");
    }

    @Override
    void start() {
        System.out.println("KingGame start...");
    }

    @Override
    void end() {
        System.out.println("KingGame end...");
    }
}

public class PeaceGame extends Game{
    @Override
    void init() {
        System.out.println("PeaceGame init...");
    }

    @Override
    void start() {
        System.out.println("PeaceGame start...");
    }

    @Override
    void end() {
        System.out.println("PeaceGame end...");
    }
}
  1. 使用 Game 的模板方法 play() 来演示游戏的定义方式。
public class TemplatePatternDemo {

    public static void main(String[] args) {
        Game kingGame = new KingGame();
        kingGame.play();

        Game peaceGame = new PeaceGame();
        peaceGame.play();
    }
}
  1. 执行程序,输出结果。

模板模式(TemplatePattern)_第1张图片

你可能感兴趣的:(设计模式,java,开发语言,模板方法模式)