美文网首页
设计模式之模板模式

设计模式之模板模式

作者: 心中翼 | 来源:发表于2019-04-29 18:25 被阅读0次

    定义

    “模板模式”定义了算法的步骤,把某些步骤的实现延迟到子类中实现。

    场景:

    实现咖啡和茶的冲泡方式。茶和咖啡的冲泡方式很相似

    咖啡冲泡步骤:
    1、把水煮沸
    2、用沸水冲泡咖啡
    3、把咖啡倒进杯子
    4、加糖和加奶

    茶冲泡步骤:
    1、把水煮沸
    2、用沸水浸泡茶叶
    3、把茶倒进杯子
    4、加柠檬

    可以看出,两者的步骤都是4步,部分步骤一致,部分步骤很类似,只是具体的操作不同。

    未使用设计模式

    Coffee

    public class Coffee {
    
        void prepareRecipe(){
            boilWater();
            brewCoffeeGrinds();
            pourInCup();
            addSugarAndMilk();
        }
    
        public void boilWater(){
            System.out.println("Boiling water");
        }
    
        public void brewCoffeeGrinds(){
            System.out.println("Dripping coffee through filter");
        }
    
        public void pourInCup(){
            System.out.println("Pouring into cup");
        }
    
        public void addSugarAndMilk(){
            System.out.println("Adding Sugar and Milk");
        }
    }
    
    
    public class Tea {
    
        void prepareRecipe(){
            boilWater();
            steepTeaBag();
            pourInfCup();
            addLemon();
        }
    
        public void boilWater(){
            System.out.println("Boiling water");
        }
    
        public void steepTeaBag(){
            System.out.println("Steeping the tea");
        }
    
        public void addLemon(){
            System.out.println("Adding Lemon");
        }
    
        public void pourInfCup(){
            System.out.println("Pouring into cup");
        }
    }
    

    以上代码可以发现,有一些冗余部分,例如boilWater,pourInfCup完全一致,这部分可以抽取出来。
    brewCoffeeGrinds与steepTeaBag差异不大,可以起一个新的方法名称brew();
    加糖与加牛奶很类似

    实现

    抽象类 CaffeieneBeverage实现了prepareRecipe(),该方法固定了算法的步骤。
    boilWater() 与pourInCup() 因为实现完全一样,CaffeieneBeverage直接实现了,子类可以继承

    public abstract class CaffeineBeverage {
        final void prepareRecipe(){
            boilWater();
            brew();
            pourInCup();
            addCondiments();
        }
    
        abstract void brew() ;
    
        abstract void addCondiments() ;
    
        void boilWater(){
            System.out.println("Boiling water");
        }
    
        void pourInCup(){
            System.out.println("Pouring into cup");
        }
    }
    
    

    Tea子类继承CaffeieneBeverage,prepareRecipe(),boilWater(),pourInCup()实现了重用。
    Tea子类还实现了自己独有的brew(),addCondiments()方法,可以自定义方法功能。

    public class Tea extends CaffeineBeverage {
        @Override
        void brew() {
            System.out.println("Steeping the tea");
        }
    
        @Override
        void addCondiments() {
            System.out.println("Adding Lemon");
        }
    }
    

    Coffee 子类同样也自定义了自己的brew()与addCondiments()

    public class Coffee extends CaffeineBeverage {
        @Override
        void brew() {
            System.out.println("Dripping Coffee through filter");
        }
    
        @Override
        void addCondiments() {
            System.out.println("Adding Sugar and Milk");
        }
    }
    

    完成功能调用,而且使用方使用的时候很简单,一个方法就直接可以使用,不用按步骤去调用四个方法。

        public static void main(String[] args) {
            Tea t = new Tea() ;
            Coffee coffee = new Coffee() ;
    
            t.prepareRecipe();
            coffee.prepareRecipe();
        }
    

    类图

    image.png

    相关文章

      网友评论

          本文标题:设计模式之模板模式

          本文链接:https://www.haomeiwen.com/subject/agdunqtx.html