美文网首页工作生活
实践之路《模板方法模式》

实践之路《模板方法模式》

作者: 菜根_ | 来源:发表于2019-07-02 10:09 被阅读0次
    1. 定义

    定义一个模板结构,将具体内容延迟到子类去实现。

    2. 主要作用

    在不改变模板结构的前提下在子类中重新定义模板中的内容。模板方法模式是基于”继承“的;

    3. 解决的问题

    提高代码复用性,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中,实现了反向控制
    通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”

    4. 实例讲解

    背景:学炒菜:酸辣土豆丝 & 辣炒花蛤
    冲突:两道菜的炒菜步骤有的重复有的却差异很大,记不住
    解决方案:利用代码记录下来

    步骤一: 创建抽象模板结构(Abstract Class):炒菜的步骤

    public  abstract Eatclass Abstract Class {  
    //模板方法,用来控制炒菜的流程 (炒菜的流程是一样的-复用)
    //申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序 
            final void DrinkProcess(){  
            //第一步:倒水
            this.pourOil();
            //第二步:热油
             this.HeatOil();
            //第三步:倒菜
             this.pourVegetable();
            //第四步:倒调味料
             this.pourSauce();
            //第五步:翻炒
             this.fry();
        }  
    
    //定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的
    
    //第一步:倒油是一样的,所以直接实现
    void pourOil(){  
            System.out.println("倒油");  
        }  
    
    //第二步:热油是一样的,所以直接实现
        void  HeatOil(){  
            System.out.println("热油");  
        }  
    
    //第三步:倒蔬菜是不一样的(一个下土豆丝,一个是下花蛤)
    //所以声明为抽象方法,具体由子类实现 
        abstract void  pourVegetable();
    
    //第四步:倒调味料是不一样的(一个下醋,一个是下辣椒)
    //所以声明为抽象方法,具体由子类实现 
        abstract void  pourSauce();
    
    
    //第五步:翻炒是一样的,所以直接实现
        void fry();{  
            System.out.println("炒到熟");  
        }  
    }
    

    步骤二: 创建具体模板(Concrete Class),即”酸辣土豆丝“和” 辣炒花蛤“的具体步骤

    //酸辣土豆丝的类
      public class ConcreteClass_TuDouSi extend  Abstract Class{
        @Override
        public void  pourVegetable(){  
            System.out.println(”下锅的蔬菜是土豆丝“);  
        }  
        @Override
        public void  pourSauce(){  
            System.out.println(”下锅的酱料是醋“);  
        }  
    }
    //辣炒花蛤的类
      public class ConcreteClass_HuaGe extend  Abstract Class{
        @Override
        public void  pourVegetable(){  
            System.out.println(”下锅的蔬菜是花蛤“);  
        }  
        @Override
        public void  pourSauce(){  
            System.out.println(”下锅的酱料是辣椒“);  
        }  
    }
    

    步骤三:

    public class Template Method{
      public static void main(String[] args){
    
    //炒 - 手撕包菜
        ConcreteClass_BaoCai BaoCai = new ConcreteClass_BaoCai();
        BaoCai.cookProcess();
    
    //炒 - 蒜蓉菜心
      ConcreteClass_ CaiXin = new ConcreteClass_CaiXin();
        CaiXin.cookProcess();
        }
            
    }
    
    优点:
    • 提高代码复用性
    • 将相同部分的代码放在抽象的父类中
    • 提高了拓展性
    • 将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
    • 实现了反向控制
    • 通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
    缺点:

    引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。

    设计模式只能算是一种药,当你的代码出现了问题时才需要吃药。

    相关文章

      网友评论

        本文标题:实践之路《模板方法模式》

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