美文网首页
模板模式

模板模式

作者: y丶M1ng | 来源:发表于2018-09-21 15:35 被阅读0次

    很久没写东西了,说忙也不是很忙,说空也不是很空,总是有些事情打扰,说到底还是懒吧。╮(╯▽╰)╭今天重新开始写东西,先把之前的设计模式的坑补完,最近开始看设计模式之禅,怎么说呢,我觉得介绍的还好,感觉跟大话设计模式差不多吧,讲的比较基础,不过入门够了。
    模板模式 顾名思义,就是建立一个模板,在这个抽象类中定义方法完成这一系列的逻辑,让他的子类就不需要重复的写相同的代码。主要用于一些方法通用,却在每一个子类都重新写了这一方法。
    这边以做菜为例子。首先我们要定义一个抽象类,将做菜分为3个步骤,第一步 准备材料 第二步是具体做法 第三步就是从锅盛到盘子里。

    做菜模板类


    package PrototypePattern;
    
    public abstract class CookTemplate {
        /**
         * 准备食材
         */
        public abstract void repareMaterials() ;
        /**
         * 具体的整个过程
         */
        public abstract void cuisine() ;
        /**
         * 具体的整个过程
         */
        public abstract void carriedDishes();
        /**
         * 具体的整个过程
         */
        public final  void cookdDoing(){
            this.repareMaterials();
            this.cuisine();
            this.carriedDishes();
        }
    }
    

    接着我们来做一个西红柿炒蛋。

    package PrototypePattern;
    
    public class TomatoOmelette extends CookTemplate{
    
        @Override
        public void repareMaterials() {
            System.out.println("准备西红柿与鸡蛋");
        }
    
        @Override
        public void cuisine() {
             System.out.println("鸡蛋倒入锅里,然后倒入西红柿一起炒。");
        }
    
        @Override
        public void carriedDishes() {
             System.out.println("将炒好的西红寺鸡蛋放入盘子里。");
        }
    
    }
    

    做完了西红柿炒蛋,继续完成一份红烧肉
    package PrototypePattern;

    public class Bouilli extends CookTemplate{
    
        @Override
        public void repareMaterials() {
            System.out.println("切猪肉。");
            
        }
    
        @Override
        public void cuisine() {
            System.out.println("红烧肉怎么做。。。我也不知道╮(╯▽╰)╭,就假装做好了吧");
            
        }
    
        @Override
        public void carriedDishes() {
            System.out.println("将红烧肉放到盘子里");
            
        }
    
    }
    

    最后就是main函数中,开始做这两道菜了

    package PrototypePattern;
    
    public class Client {
        public static void main(String[] args) {
            CookTemplate cookTemplate=new TomatoOmelette();
            cookTemplate.cookdDoing();
            System.out.println("----------------------------------");
            cookTemplate=new Bouilli();
            cookTemplate.cookdDoing();
        }
    }
    

    显示结果

    控制台显示.png

    可以看到我不需要重复的在子类中写如何做菜,我需要去调用cookDoing()这个方法就可以得到每道菜。
    这就是模板模式了,模板模式还是比较简单,主要为了就是减少子类的重复编写
    在设计模式之禅中,还提到一点,比如做菜每个人的口味不同,对于加不加糖各有见解,比如西红柿炒蛋要加糖,而红烧肉不要加糖。(至于真的要不要加糖,我是真的不知道,别喷我瞎说TAT)
    这样就要进行修改,在模板类上增加isAddSugar方法用来判断是否加糖

    package PrototypePattern;
    
    public abstract class CookTemplate {
    
        /**
         * 准备食材
         */
        public abstract void repareMaterials() ;
        /**
         * 具体的整个过程
         */
        public abstract void cuisine() ;
        /**
         * 具体的整个过程
         */
        public abstract void carriedDishes();
        /**
         * 具体的整个过程
         */
        public final void cookdDoing(){
            this.repareMaterials();
            this.cuisine();
            if(isAddSugar())
                System.out.println("加糖");
            this.carriedDishes();
        }
        /**
         *  是否要加糖,默认不加糖
         */
        protected boolean isAddSugar(){
            return false;
        }
    }
    
    package PrototypePattern;
    
    public class TomatoOmelette extends CookTemplate{
        private boolean addSugar = true; 
        @Override
        public void repareMaterials() {
            System.out.println("准备西红柿与鸡蛋");
            
        }
    
        @Override
        public void cuisine() {
             System.out.println("鸡蛋倒入锅里,然后倒入西红柿一起炒。");
        }
    
        @Override
        public void carriedDishes() {
             System.out.println("将炒好的西红寺鸡蛋放入盘子里。");
        }
        @Override
        protected boolean isAddSugar() {
            return this.addSugar;
        }
        //客户可以决定要不要加糖
        public void setAlarm(boolean isAddSugar){
            this.addSugar = isAddSugar;
        }
    }
    

    测试类中

    package PrototypePattern;
    
    public class Client {
        public static void main(String[] args) {
            TomatoOmelette tomatoOmelette=new TomatoOmelette();
            tomatoOmelette.setAlarm(true);
            tomatoOmelette.cookdDoing();
            System.out.println("----------------------------------");
            Bouilli bouilli=new Bouilli();
            bouilli.cookdDoing();
            
        }
    }
    
    控制台结果.png

    我们可以通过手动设置来完成对西红柿炒蛋是否加糖。这被称为钩子方法。在整个模板模式中更多的要注意到应该是访问权限以及对父类中的cookDoing这个方法的封装,需要加上final来防止子类对这个方法的修改。这样就完成模板模式了。
    写到这里我觉得模板模式是设计模式中比较简单的一种,之前一直觉得单例简单,但是在涉及到锁之后其实也没这么简单。 但是模板模式好像没这么多坑,应该是最好理解的一种设计模式了

    相关文章

      网友评论

          本文标题:模板模式

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