• 设计模式----模板方法模式


    一、什么是模板方法模式

      模板方法在抽象类的一个方法中定义一个算法的骨架,将具体的算法实现放在子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

    二、什么时候该使用钩子方法?

      当你的子类“必须”提供算法中某个方法或步骤的实现时,就用抽象方法。如果算法的这个部分是可选的,就用钩子。钩子方法可以让子类控制算法结构。

    三、好莱坞原则的作用

      避免让高层和低层组件之间有明显的环状依赖。将决策权放在高层模块中,以便决定如何以及何时调用低层模块。

    四、模板、策略和工厂方法模式的区别

    模板方法--子类决定如何实现算法中的某些步骤;

    策略模式---封装可互换的行为,然后使用委托来决定要采用哪一个行为;

    工厂方法---由子类决定实例化哪个具体类;

    策略模式和模板方法模式都封装算法,一个用组合,一个用继承。工厂方法是模板方法的一种特殊版本。

    五、模板方法模式的代码实现

    package modelMethod;
    
    public class Test {
        public static void main(String[] args) {
            Coffee coffee = new Coffee();
            coffee.process();
            System.out.println("-------------------");
            Tea tea = new Tea();
            tea.process();
        }
        
    }
    package modelMethod;
    /**
     * 冲泡抽象模板类
     * @author lenovo
     *
     */
    public abstract class ChongPao {
        abstract void boilWater();
        abstract void brew();
        abstract void pourInCup();
        abstract void addCondiments();
        boolean hoke(){ 
            return true;
        }
        
        void process(){
            boilWater();
            brew();
            pourInCup();
            if(hoke()){
                addCondiments();
            }
        }
    }
    package modelMethod;
    
    public class Coffee extends ChongPao{
    
        @Override
        void boilWater() {
            System.out.println("咖啡烧水");
        }
    
        @Override
        void brew() {
            System.out.println("放咖啡");
            
        }
    
        @Override
        void pourInCup() {
            System.out.println("往咖啡杯倒开水");
            
        }
    
        @Override
        void addCondiments() {
            System.out.println("咖啡加糖");
            
        }
        
        public boolean hoke(){
            System.out.println("泡咖啡默认加糖,冲泡完成");
            return false;
        }
    
    }
    package modelMethod;
    
    public class Tea extends ChongPao{
    
        @Override
        void boilWater() {
            System.out.println("泡茶烧水");
            
        }
    
        @Override
        void brew() {
            System.out.println("放茶叶");
            
        }
    
        @Override
        void pourInCup() {
            System.out.println("往茶杯倒开水");
            
        }
    
        @Override
        void addCondiments() {
            System.out.println("往茶杯加糖");
            
        }
        
        public boolean hoke(){
            System.out.println("泡茶默认不加糖,冲泡完成");
            return false;
        }
    
    }

    运行结果:

  • 相关阅读:
    添物不花钱学JavaEE(基础篇)- Servlet
    添物不花钱学JavaEE(基础篇)-JSP
    添物不花钱学JavaEE(基础篇)- Java
    添物不花钱学JavaEE(基础篇)-XML
    61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】
    js正则表达式(2)
    js的正则表达式
    js(11)
    猜拳游戏
    鼠标移动到不同元素进行切换
  • 原文地址:https://www.cnblogs.com/chuyuan/p/6432091.html
Copyright © 2020-2023  润新知