zoukankan      html  css  js  c++  java
  • 设计模式-模板方法模式

    1、模板方法模式

      定义一个操作中的算法的框架,而将一些步骤延迟到子类中。

      常见的生活中模板举例:银行规定了办理业务的模板/步骤,1)进门取号;2)填写单据;3)等待叫号;4)窗口办理。第二步由具体的客户填写不同的单子,第四步银行业务员根据不同单子,做不同的业务操作

    2、模板方法模式的实现要素
      定义一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法交由子类实现剩余逻辑,用钩子方法给你子类更大的灵活性,最后将方法汇总构成一个不可变的模板方法。模板方法模式适用于算法或操作遵循相似的逻辑的场景

    3、模板方法模式的应用--制作饮料

    定义抽象基类:由算法框架、基本方法、抽象方法、钩子函数组成

    package com.cn.shejimoshi.mobanfangfamoshi;
    
    /**
     * 抽象基类,为所有子类提供一个算法框架
     *
     */
    public abstract class RefreshBeverage {
    
        /**
         * 制备饮料的模板方法
         * 封装了所有子类共同遵循的算法框架
         */
        public final void prepareBeverageTemplate(){
    
            //步骤1 将水煮沸
            boilWater();
            //步骤2 泡制饮料
            brew();
            //步骤3 将饮料倒入杯中
            pourIncup();
    
            if (isCustomerWantCondiments()){
                //步骤4 加入调味料
                addCondiments();
            }
        }
    
        /**
         * 钩子函数,提供一个默认或空的实现
         * 具体的子类可以自行决定是否挂钩(此处特定场景表示钩子函数的返回的true或false)以及如何挂钩(钩子函数的实现逻辑)
         * 询问用户是否加入调料
         * @return
         */
        protected boolean isCustomerWantCondiments() {
            return true;//默认加入调味料
        }
    
        /**
         * 基本方法(私有,算法框架中不会变化的步骤)--将水煮沸
         */
        private void boilWater() {
            System.out.println("将水煮沸");
        }
    
        protected abstract void brew();
        /**
         * 基本方法(私有,算法框架中不会变化的步骤)--将饮料倒入杯中
         */
        private void pourIncup(){
            System.out.println("将饮料倒入杯中");
        }
    
        protected abstract void addCondiments();
    }

    实现类1-Coffee

    package com.cn.shejimoshi.mobanfangfamoshi;
    
    /**
     * 具体子类,提供了咖啡制作的具体实现
     */
    public class Coffee extends RefreshBeverage {
    
        @Override
        protected void brew() {
            System.out.println("用沸水冲泡咖啡");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("加入糖和牛奶");
        }
    }

    实现类2-Tea

    package com.cn.shejimoshi.mobanfangfamoshi;
    
    public class Tea extends RefreshBeverage {
        @Override
        protected void brew() {
            System.out.println("用80度的热水浸泡茶叶5分钟");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("加入柠檬");
        }
    
        @Override
        protected boolean isCustomerWantCondiments() {
            return false;//不加调料
        }
    }

    测试方法

    package com.cn.shejimoshi.mobanfangfamoshi;
    
    import org.junit.Test;
    
    public class RefreshBeverageTest {
    
        @Test
        public void coffeeTest(){
            RefreshBeverage refreshBeverage=new Coffee();
            refreshBeverage.prepareBeverageTemplate();
        }
    
        @Test
        public void teaTest(){
            RefreshBeverage refreshBeverage=new Tea();
            refreshBeverage.prepareBeverageTemplate();
        }
    }

    写在最后:

     设计模式是一种经验总结、编程思想,拒绝代码的迷惑。

     一种设计模式的代码变体可以有很多,但万变不离其

  • 相关阅读:
    容斥原理解决某个区间[1,n]闭区间与m互质数数量问题
    Educational Codeforces Round 28
    括号匹配问题(区间dp)
    小球装箱问题八连(组合数学)
    Educational Codeforces Round 29
    Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
    Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)
    Opencv保存读取float类型深度图
    OpenGL快速入门
    使用selenium判断标签的元素值是否存在
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9613239.html
Copyright © 2011-2022 走看看