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

设计模式,学习,十四,模板,方法 · 浏览次数 : 594

小编点评

**模板方法**是一种行为型模式,它定义一个类中的抽象方法,子类可以继承并实现不同的实现。 **模板方法的优点**: * 降低代码重复性。 * 允许子类根据需要进行扩展。 * 提高代码可维护性。 **模板方法的实现**: 1. 定义一个抽象类,包含所有模板方法。 2. 在子类中实现特定的实现。 3. 在调用模板方法时,传入子类的实例。 **模板方法的示例**: ```java public abstract class Game { protected abstract void init(); protected abstract void start(); protected abstract void end(); public final void play() { init(); start(); end(); } } public class BasketballGame extends Game { @Override public void init() { System.out.println("basketball init"); } @Override public void start() { System.out.println("basketball start"); } @Override public void end() { System.out.println("basketball end"); } } ``` **模板方法的应用场景**: * **设计复用的代码**:当需要对多个类进行相同的操作时,可以使用模板方法。 * **支持多种数据类型的处理**:模板方法可以根据数据类型进行判断,执行不同的操作。 * **提高代码可维护性**:通过使用模板方法,可以减少代码重复性,提高代码可维护性。 **其他例子**: * **测试用例模板方法**:可以用于定义测试用例的模板,并通过继承来实现不同的测试方法。 * **抽象数据类型模板方法**:可以用于定义抽象数据类型的模板,并提供不同的实现类来实现不同的功能。

正文

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

作者: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 图

代码

更多

设计模式学习专栏

参考资料

与设计模式学习(十四):模板方法相似的内容:

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

设计模式学习(十四):模板方法 作者:Grey 原文地址: 博客园:设计模式学习(十四):模板方法 CSDN:设计模式学习(十四):模板方法 模板方法 模板方法是一种行为型模式。 假设我们要实现一个游戏,这个游戏有「初始化」,「启动」,「结束」三个方法,那么可以定义一个游戏的模板: public a

设计模式学习(十一):组合模式

设计模式学习(十一):组合模式 作者:Grey 原文地址: 博客园:设计模式学习(十一):组合模式 CSDN:设计模式学习(十一):组合模式 组合模式 组合模式是一种结构型模式。 组合模式中,最常用的一个用法就是目录层级的遍历,话不多说,直接上代码,主方法中 public class Main {

设计模式学习(十八):迭代器模式

设计模式学习(十八):迭代器模式 作者:Grey 原文地址: 博客园:设计模式学习(十八):迭代器模式 CSDN:设计模式学习(十八):迭代器模式 迭代器模式 迭代器模式是一种行为型模式。 迭代器最典型的应用是容器遍历 模仿 JDK 的容器,我们自定义一个容器并实现 iterator 方法; 首先,

设计模式学习(十二):享元模式

设计模式学习(十二):享元模式 作者:Grey 原文地址: 博客园:设计模式学习(十二):享元模式 CSDN:设计模式学习(十二):享元模式 享元模式 享元模式是一种结构型模式。 一个应用场景是:运用共享技术有效地支持大量细粒度的对象。主要解决 在有大量对象时,有可能会造成内存溢出,我们把其中共同的

设计模式学习(十):门面模式

设计模式学习(十):门面模式 作者:Grey 原文地址: 博客园:设计模式学习(十):门面模式 CSDN:设计模式学习(十):门面模式 门面模式 门面模式是一种结构型模式。 门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。 假设建造一个房子需要有如下三个步骤: 第一步,和泥 第二

设计模式学习(十三):观察者模式

设计模式学习(十三):观察者模式 作者:Grey 原文地址: 博客园:设计模式学习(十三):观察者模式 CSDN:设计模式学习(十三):观察者模式 观察者模式 观察者模式是一种行为型模式。在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。 一般可以用做事件处理

设计模式学习(十五):策略模式

设计模式学习(十五):策略模式 作者:Grey 原文地址: 博客园:设计模式学习(十五):策略模式 CSDN:设计模式学习(十五):策略模式 策略模式 策略模式是一种行为型模式,它定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 以实例来说明 假设我们有一个猫类,这个类里面有体重和身高

设计模式学习(十六):责任链模式

设计模式学习(十六):责任链模式 作者:Grey 原文地址: 博客园:设计模式学习(十六):责任链模式 CSDN:设计模式学习(十六):责任链模式 责任链模式 责任链模式是一种行为型模式。 举例说明:有一段文本需要过滤一系列敏感字,我们可以通过责任链模式来设计这个功能,假设文本是 scripts H

设计模式学习(十七):状态模式

设计模式学习(十七):状态模式 作者:Grey 原文地址: 博客园:设计模式学习(十七):状态模式 CSDN:设计模式学习(十七):状态模式 状态模式 状态模式是一种行为型模式。 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 举例说明: Person 有 Cry ,

设计模式学习(十九):访问者模式

设计模式学习(十九):访问者模式 作者:Grey 原文地址: 博客园:设计模式学习(十九):访问者模式 CSDN:设计模式学习(十九):访问者模式 访问者模式 访问者模式是一种行为型模式。 访问者模式在结构不变的情况下动态改变对于内部元素的动作。 举例说明: 假设我们需要构造一台电脑,有主板( Bo