首页 > 其他分享 >设计模式学习(十四):模板方法

设计模式学习(十四):模板方法

时间:2022-11-12 07:00:09浏览次数:66  
标签:void protected 十四 设计模式 方法 public 模板

设计模式学习(十四):模板方法

作者:Grey

原文地址:

博客园:设计模式学习(十四):模板方法

CSDN:设计模式学习(十四):模板方法

模板方法

模板方法是一种行为型模式。

假设我们要实现一个游戏,这个游戏有「初始化」,「启动」,「结束」三个方法,那么可以定义一个游戏的模板:

public abstract class Game {
    // 游戏初始化
    protected abstract void init();
    // 游戏开始
    protected abstract void start();
    // 游戏结束
    protected abstract void end();
    // 玩游戏方法
    protected final void play() {
        init();
        start();
        end();
    }
}

每种类似这样结构(有「初始化」,「启动」,「结束」三个步骤)的游戏都可以继承这个类来实现这三个方法,比如:

BasketballGame

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

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

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

FootballGame

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

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

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

主方法在调用的时候,直接调用其 play() 方法,就可以了。

Game basketballGame = new BasketballGame();
basketballGame.play();
Game footballGame = new FootballGame();
footballGame.play();

本示例的 UML 图如下:

image

另外一个例子,

假设我们要设计一系列的测试用例,然后运行这些测试用例的的测试方法,可以抽象出一个 TestCase 的模板方法,代码如下

public abstract class TestCase {
    public void run() {
        if (doTest()) {
            System.out.println("Test succeed.");
        } else {
            System.out.println("Test failed.");
        }
    }

    public abstract boolean doTest();
}

其中 TestCase 是抽象类,doTest() 是抽象方法,这样每个具体的测试用例,就只需要继承这个抽象类,并且实现其具体的 doTest()方法即可。

public class UserServiceTest extends TestCase {

    @Override
    public boolean doTest() {
        System.out.println("do test...");
        return false;
    }

}

主方法在调用的时候,直接把一系列的 TestCase 进行遍历并执行 run() 方法即可

public class JunitApplication {
    private static final List<TestCase> testCases = new ArrayList<>();

    public static void register(TestCase testCase) {
        testCases.add(testCase);
    }

    public static final void main(String[] args) {
        for (TestCase c : testCases) {
            c.run();
        }
    }
}

模板方法实际应用场景举例

  • Spring 中的 RestTemplate 、JDBCTemplate 等。

  • Java SE 中的 Collections.sort() 方法也可以看成模板方法。

  • Java SE 中的 AbstractList 类定义了一些模板方法,ArrayList 作为子类实现了对应的模板方法。

  • MyBatis 中的 BaseExecutor 定义了模板方法,子类 ReuseExecutor 、SimpleExecutor 、BatchExecutor 和 ClosedExecutor 实现了对应的模板方法

  • Redission 的红锁和联锁设计。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:void,protected,十四,设计模式,方法,public,模板
From: https://www.cnblogs.com/greyzeng/p/16882638.html

相关文章

  • Java静态代理设计模式模式(多线程Runnable)
    静态代理设计模式,就是代理对象来帮你忙前忙后,你负责出席一下就好了。需要:1.实现相同的接口2.真实角色3.代理角色,里面有一个成员是接口对象(实际上是真实角色----接口实......
  • 设计模式学习(十三):观察者模式
    设计模式学习(十三):观察者模式作者:Grey原文地址:博客园:设计模式学习(十三):观察者模式CSDN:设计模式学习(十三):观察者模式观察者模式观察者模式是一种行为型模式。在对象之间......
  • [FastAPI-02]模板渲染
    1.插件库pipinstall-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.comjinja2aiofiles2.模板渲染程序2.1Python程序#_*_coding:UTF-8_*_......
  • C#设计模式之建造者模式
      原文网址:https://www.jb51.net/article/254976.htm场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商......
  • java使用freemarker模板插件生成html页面
    1、功能描述:使用java代码,根据指定的ftl模板文件,生成html静态页面文件 freemarker模板是直接可以与SSM这种javaweb项目、或springboot整合的,不做前后分离。跟jsp差不多......
  • 软件设计模式白话文系列(六)代理模式
    1、描述代理模式属于结构型模式中的一种,通过对代理对象的调用来达到对原对象的增强、减弱作用。通过代理类的生成时机,我们将编译期就生成代理类的情况称之为静态代理模式,......
  • 乱七八糟的模板集合
    字符串1.字符串哈希(可以用于直接比较字符串相同,找循环节[hash(l,r-x)==hash(l+x,r)可判定x为一个循环节])1//采用自然溢出2typedefunsignedlonglong......
  • JVS低代码支持对模板打印,公文、格式文件、纸质单据不再烦恼
    日常工作中,我们需要各种不同的打印的资质文件,如下图所示,大量的内容需要手动填写,容易出错,那么我们可以用JVS的低代码进行配置管理,下面我们来看看具体的打印模板的配置。  ......
  • 数组-滑动窗口(直接套模板完事儿)
    前言兄弟们,互联网寒冬期,算法刷着走。上篇文章讲了双指针的左右指针,双指针是数组类算法题中最重要的一个分支之一。这篇文章讲双指针技巧的滑动窗口。遇到双指针的题目,直接......
  • Android实战简易教程-第六十四枪(Android APP 引导页实现-第一次应用进入时加载)
    APP引导页是每个优质APP必备的元素,下面我们研究一下如何只在第一次进入应用时进行加载引导页的方法。1.判断是否第一次进入应用的方法:packagecom.yayun.guide;importandr......