模板模式

很久没写东西了,说忙也不是很忙,说空也不是很空,总是有些事情打扰,说到底还是懒吧。╮(╯▽╰)╭今天重新开始写东西,先把之前的设计模式的坑补完,最近开始看设计模式之禅,怎么说呢,我觉得介绍的还好,感觉跟大话设计模式差不多吧,讲的比较基础,不过入门够了。
模板模式 顾名思义,就是建立一个模板,在这个抽象类中定义方法完成这一系列的逻辑,让他的子类就不需要重复的写相同的代码。主要用于一些方法通用,却在每一个子类都重新写了这一方法。
这边以做菜为例子。首先我们要定义一个抽象类,将做菜分为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来防止子类对这个方法的修改。这样就完成模板模式了。
写到这里我觉得模板模式是设计模式中比较简单的一种,之前一直觉得单例简单,但是在涉及到锁之后其实也没这么简单。 但是模板模式好像没这么多坑,应该是最好理解的一种设计模式了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容