样板方法模式-Template method
最近在学design pattern,看到一个模式很熟悉,原来是曾经在一个爬虫系统中见过使用这个架构。
应用
这个模式叫 样板方法模式
通常应用在有一套固定步骤的系统中,
例如,我曾见过的爬虫系统:
1.开始
2.爬文章
3.整理格式
4.写入DB
5.结束
就可以把这样的流程定义在AbstractClass的templateMethod中
结构图长这样:
範例
现在以一个煮咖啡因饮料当作範例,
煮饮料的流程是:
首先宣告共同流程的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/