设计模式之模板模式

104 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

简介

模板模式定义:

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

模板模式相对比较简单也比较好理解,在我们日常的开发中比较常见,也确实是比较好用的模式之一。

我对模板模式的理解是如果有一系列的操作步骤是固定的或者比较类似的,我们常规的做法是,针对A操作,先初始化、执行、销毁;同样对B操作也是初始化、执行、销毁如此。。。

这样做起来就感觉A操作、B操作没有任何关系,比较零散。所以我们将这类操作抽象化,然后定义通过定义一个相对的方法,将步骤化的操作整合成一个方法,然后将初始化、执行、销毁抽象化,延迟到具体的操作中去延迟实现,即定义方法的骨架,即模板。

随后我们在具体的操作(A操作、B操作)中去实现初始化、执行、销毁可以。

案例

我们后台开发经常要对接其他的系统,调用第三方接口获取数据。咱们通过一个同步用户和订单到数据库的例子来说明模板模式。对方系统提供2个接口,一个获取用户信息,一个获取用户的订单信息。

首先我们定义一个抽象的骨架,定义出调用各种接口获取数据的模板方法:一个构建参数的抽象方法、一个post调用接口的方法、一个将数据持久化的方法。然后再定义一个执行的方法,分别去调用上述三个方法、完成一个完成的数据同步的过程。要注意这个execute方法是个final的,表明在子类中无法重写这个方法,模板方法就给你定义好了,不准改。

public abstract class SyncData {
    abstract void buildParam();
    abstract void postData();
    abstract void persistData();

    public final void execute() {
        buildParam();
        postData();
        persistData();
    }
}

定义同步用户基本信息的实现类

public class BasicData extends SyncData {
    @Override
    void buildParam() {
        System.out.println("build basic data");
    }

    @Override
    void postData() {
        System.out.println("post basic data");
    }

    @Override
    void persistData() {
        System.out.println("persist basic data");
    }
}

定义一个同步订单的实现类

public class OrderData extends SyncData {
    @Override
    void buildParam() {
        System.out.println("build order data");
    }

    @Override
    void postData() {
        System.out.println("post order data");
    }

    @Override
    void persistData() {
        System.out.println("persist order data");
    }
}

测试类中直接调用execute就可以了

public class App {
    public static void main(String[] args) {
        SyncData syncData = new BasicData();
        syncData.execute();
        syncData = new OrderData();
        syncData.execute();
    }
}

总结

利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性,而且模板方法将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。模板方法在我们开发的过程中的应用范围还是比较广的,大家在实战中多应用。