• 模板模式


    摘录自headfirst 设计模式:

    模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

    实例说明:

    做热咖啡或者热茶需要步骤:1.烧水,2.用沸水冲泡咖啡(或茶),3.倒进杯子里,4.加调料,其中步骤1和3是做咖啡或茶共通的方法,步骤2和4的具体细节是不相同的,因此抽象出步骤类,将步骤2和4抽象成方法各子类均有不同实现

    高层组件:CaffeineBeverageWithHook.java

    /**
     * 高层组件
     *
     * @author :liuqi
     * @date :2018-06-11 16:00.
     */
    public abstract class CaffeineBeverageWithHook {
        /**
         * 模板方法:抽出做茶和咖啡共通的方法
         */
        void prepareRecipe() {
            // 烧水
            boilWater();
            // 用沸水冲泡
            brew();
            // 倒进杯里
            pourIncup();
            // 如果顾客想要调料则添加调料
            if (customerWantsConfiments()) {
                // 添加调料
                addCondiments();
            }
        }
    
        /**
         * 用沸水冲泡(各子类实现不同)
         * <p>
         * 抽象方法
         */
        abstract void brew();
    
        /**
         * 加调料(各子类实现不同)
         * <p>
         * 抽象方法
         */
        abstract void addCondiments();
    
        /**
         * 烧水
         */
        void boilWater() {
            System.out.println("boiling water");
        }
    
        /**
         * 倒进杯里
         */
        void pourIncup() {
            System.out.println("Pouring into cup");
        }
    
        /**
         * 顾客是否想要调料
         * hook 钩子,子类可以覆盖
         *
         * @return
         */
        boolean customerWantsConfiments() {
            return true;
        }
    }

    低层组件:CoffeeWithHook.java  和  TeaWithHook.java

    /**
     * 做咖啡的方法类
     *
     * @author :liuqi
     * @date :2018-06-11 16:00.
     */
    public class CoffeeWithHook extends CaffeineBeverageWithHook {
        /**
         * 用沸水冲泡咖啡的方法
         */
        @Override
        void brew() {
            System.out.println("Dripping coffee through filter");
        }
    
        /**
         * 添加咖啡所需要的调料
         */
        @Override
        void addCondiments() {
            System.out.println("adding suger and milk");
        }
    
        /**
         * 覆盖了hook
         *
         * @return
         */
        @Override
        public boolean customerWantsConfiments() {
            // 顾客想要不加任何调料的咖啡(这里写死)
            return false;
        }
    }
    /**
     * 做茶的方法类
     *
     * @author :liuqi
     * @date :2018-06-11 16:09.
     */
    public class TeaWithHook extends CaffeineBeverageWithHook {
        /**
         * 用沸水冲泡茶的方法
         */
        @Override
        void brew() {
            System.out.println("Steeping the tea");
        }
    
        /**
         * 添加茶所需要的调料
         */
        @Override
        void addCondiments() {
            System.out.println("Adding lemon");
        }
    }

    测试类:BeverageTestDrive.java

    /**
     * 测试类
     *
     * @author :liuqi
     * @date :2018-06-11 16:13.
     */
    public class BeverageTestDrive {
        public static void main(String[] args) {
            TeaWithHook tea = new TeaWithHook();
            CoffeeWithHook coffee = new CoffeeWithHook();
            System.out.println("making tea~~~~~");
            tea.prepareRecipe();
            System.out.println("making coffee~~~~~");
            coffee.prepareRecipe();
        }
    }

    运行结果:

    making tea~~~~~
    boiling water
    Steeping the tea
    Pouring into cup
    Adding lemon
    making coffee~~~~~
    boiling water
    Dripping coffee through filter
    Pouring into cup

     代码地址:https://github.com/yuki9467/TST-javademo/tree/master/src/main/template

  • 相关阅读:
    js替换问题replace和replaceAll
    CSS截取标题...
    MVC FormCollection collection
    IE和FF判断浏览器是否安装了flash插件
    Uploadify上传插件不兼容FF、Chrome等Netscape浏览器
    jquery错误消息: “Date”未定义,“String”未定义
    正则表达式取出指定字符窜之间的字符窜
    WPF 开发前学习(二)
    WPF 中的树应用
    WCF 数据传输遇到的问题
  • 原文地址:https://www.cnblogs.com/yuki67/p/9167899.html
Copyright © 2020-2023  润新知