Design Pattern - Template method(样板方法模式),来开一间饮料店吧

样板方法模式-Template method

最近在学design pattern,看到一个模式很熟悉,原来是曾经在一个爬虫系统中见过使用这个架构。


应用

这个模式叫 样板方法模式
通常应用在有一套固定步骤的系统中,
例如,我曾见过的爬虫系统:

1.开始
2.爬文章
3.整理格式
4.写入DB
5.结束

就可以把这样的流程定义在AbstractClass的templateMethod中

结构图长这样:
template method


範例

现在以一个煮咖啡因饮料当作範例,
煮饮料的流程是:

把水煮滚煮原料(咖啡包、茶包)把饮料倒入杯中如果需要,可以加料

首先宣告共同流程的abstract class

public abstract class CaffeineBeverage {    // templateMethod:定义煮饮料的流程,并宣告为final,避免被subClass override    final void prepareDrink() {          boilWater();        brew();        pourInCup();        if (customerWantsCondiments()) {            addCondiments();        }    }    // 因应不同饮料有不同的煮法,宣告为abstract,subclass必须override    abstract void brew();      abstract void addCondiments();    // 所有饮料共通的流程,所以在abstract class这边就写逻辑了,但如有需要还是可以被subclass override    void boilWater() {        System.out.println("Boiling water.");    }    void pourInCup() {        System.out.println("Pouring into water.");    }    // Hook,通常会是空的,可以由subClass决定要不要override    boolean customerWantsCondiments() {         return true;    }}

接下来是concreteClass,先是Coffee类别

public class Coffee extends CaffeineBeverage {    @Override    void brew() {        System.out.println("Brew coffee.");    }    @Override    void addCondiments() {        System.out.println("Add milk.");    }}

接下来是另一个concreateClass,NoSugarTea类别

public class NoSugarTea extends CaffeineBeverage {    @Override    void brew() {        System.out.println("Brew no sugar tea.");    }    @Override    void addCondiments() {        System.out.println("Don't add condiments. This shouldn't be printed.");    }    // 这边有override hook,因为无糖茶不想加料,所以return false    @Override    boolean customerWantsCondiments() {         return false;    }}

最后是client code

public class CaffeineBeverageClient {    public static void main(String[] args) {        System.out.println("I would like a cup of coffee.");        CaffeineBeverage coffee = new Coffee();        coffee.prepareDrink();        System.out.println("");        System.out.println("I would like a cup of no sugar tea.");        CaffeineBeverage noSugarTea = new NoSugarTea();        noSugarTea.prepareDrink();    }        /**     * output:     *      * I would like a cup of coffee.     * Boiling water.     * Brew coffee.     * Pouring into water.     * Add milk.     *     * I would like a cup of no sugar tea.     * Boiling water.     * Brew no sugar tea.     * Pouring into water.     *      */}

Reference:

https://refactoring.guru/design-patterns/template-method
https://www.oreilly.com/library/view/head-first-design/0596007124/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章