如何直观的理解模板方法模式:大学里的老油条

1 直观理解

故事一: 大学生了没

记得我大一刚刚进学校时,加入了很多部门,社团领导也是多年学弟熬成学长了,继承它们的前辈风范,把一些无聊的任务甩锅给新学弟们,“三川,给咱们设计一个活动的宣传海报”,“三川,帮我整理一份会议报告”,“三川,帮我做个PPT”…

我开始一脸茫然,说,我不会做呀。学长们拍拍我的肩膀说,“别怕,等会发你一个模板。”

学长说:“你看哈,格式、插图、过渡页,都不用改。只要把新的标题替换上去,内容随便写写就OK啦。”

哇偶,拿到模板以后,简直太高兴了。

以后遇到任何事都不怕了,接到新任务,先问一句,有没有模板。

海报有了模板,只用改几个字。文档有了模板,就跟做填空题一样。不仅仅如此,大学里的实验报告,课程设计,毕业设计,全都是仰仗这那些学长的模板,才能顺利毕业。模板之于我可谓是功不可没。

后来我顺利把这一堆模板传给了后面的师弟。这一份格式老旧的模板,就这样一代代传承者,感慨呀。

故事二:小学生了没

有次小学三年级考试,李老师出了道题:全文默写 朱自清的《匆匆》。

结果,学生们有的写了一两句,有的基本就空着。

李老师发飙了:“平时不是都背过了吗,你们一个个的,脑子呢。气死我了,不及格的全部叫家长来”。

“班长,你说说,为啥一句都写不出来,平时不都背过了吗“

班长说:“没人起头…”

家长会上,家长们都抱怨,以前孩子挺聪明的呀,自从换了老师,一路下滑。还建议学校在教学质量上好好把关。李老师,脸唰的就红了。

班里考试成绩低,校长见了老师就是一顿臭骂,:“你这让我们怎么给家长交代,人家把学生送你这来学习,结果都就考了这么几分,是孩子笨,还是你不会教啊”

李老师哭着说:“考纲要求熟练掌握这篇课文的呀”

第二次考试,老师放聪明了,这卷子太难,对谁都不好,何必呢? 一定要想办法让学生能答出来。

还是朱自清的《匆匆》:

填空:

“盼望着,盼望着,东风来了,_ _ 的脚步近了,天朗润起来了,水__起来了,太让的脸 _起来了 … ”

这次考试出来,全班平均95分。

同学们洋溢着春天般的微笑;

校长也夸奖,不错不错,李老师为人师表,成果显著啊;

家长们都乐开了花,有的还要把孩子转到这个班;

2 奔入主题

从大学生要模板可以看出,模板可以把前人的成果传承给后来的新生,不用作重复的工作,只要把变动的地方改改就好了

从小学生的成绩突飞猛进可以看出,模板把一些地方写死了,保证了一个固定的流程,同时可以明显的降低难度

这就是活生生的模板方法模式,在我们的程序中,如果学长已经已经把整个流程写完了,我们就不用写新的了,只用拿过来,把改动的地方修改一下就行了。

(1)原始的粘贴复制模式

比如,学长三年前做了一个部门介绍的PPT,制作步骤如下:

public class IntroductionPPT {
    PPT ppt;
    public PPT getPPT(){
        ppt= step1(ppt);//写大纲
        ppt= addTitleAndContent(ppt);//填内容和标题
        ppt= step3(ppt);//美化插图
        ppt= step4(ppt);//做动画
        return ppt;
    }
    PPT step1(PPT ppt){
        return ppt.add("写大纲,行宽,字体,大小,间距段落,格式...");
    }
    PPT addTitleAndContent(PPT ppt){
        return ppt.add("填内容和标题");
    }

    PPT step3(PPT ppt){
        return ppt.add("美化插图");
    }
    PPT step4(PPT ppt){
        return ppt.add("做动画");
    }
}

我们问学长要来以后,基本不用改,只要把标题和内容换一下就行了:

public class MyIntroductionPPT {
    PPT ppt;
    public PPT getPPT(){
        ppt= step1(ppt);//写大纲
        ppt= addTitleAndContent(ppt);//填内容和标题
        ppt= step3(ppt);//美化插图
        ppt= step4(ppt);//做动画
        return ppt;
    }
    PPT step1(PPT ppt){
        // 不小心把这里也改了一点
        return ppt.add("写大纲,行宽,字体,大小,间距段落,格式..."); 
    }
    PPT addTitleAndContent(PPT ppt){
        return ppt.add("填写新的内容和新的标题"); // 改了这里
    }

    PPT step3(PPT ppt){
        return ppt.add("美化插图");
    }
    PPT step4(PPT ppt){
        return ppt.add("做动画");
    }
}

但是大家把这个文件拷贝来拷贝去的,把格式给弄乱了,做完PPT交上去被老师们一通臭骂。

(画外音:这是因为我们破坏了规定)

学长过来安慰说:你乱改啥呀,算了,我把其他地方写死,你们只能继承了以后再用,只能修改我让你修改的地方。

(2)改进后的模板方法模式

学长说着,把PPT改成了:

public abstract class IntroductionPPT {
    PPT ppt;
    PPT getPPT(){
        ppt= step1(ppt);//写大纲
        ppt= addTitleAndContent(ppt);//填内容和标题
        ppt= step3(ppt);//美化插图
        ppt= step4(ppt);//做动画
        return ppt;
    }
    PPT step1(PPT ppt){
        return ppt.add("写大纲,行宽,字体,大小,间距段落,格式...");
    }
    abstract PPT addTitleAndContent(PPT ppt);//填内容和标题

    PPT step3(PPT ppt){
        return ppt.add("美化插图");
    }
    PPT step4(PPT ppt){
        return ppt.add("做动画");
    }
}

学长同时规定,不准修改我的代码。

让我们再次拿到的时候,只能继承这个文档,因为把addTitleAndContent设为抽象的,所以必须要重新写,然后在外头填写:

class MyIntroductionPPT extends IntroductionPPT{

    @Override
    PPT addTitleAndContent(PPT ppt) {
        return ppt.add("填写新的内容和新的标题");
    }
}

现在我们发现别的地方都不能改了,只能修改学长给留出来的这个接口。

(3)类结构图

在这里插入图片描述

3 总结一下:

  1. 模板可以减少重复的工作
  2. 模板可以设定一种流程的规定,让新手不会把整个东西弄坏了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值