设计模式-模板模式

发布于 2021-04-05 21:41

 设计模式详解。

《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)"。
设计模式不是一种规定,也不需要为了设计模式而设计,错误的应用设计模式反而会让代码变得复杂,难以维护。相反,正确的应用设计模式,可以让我们的代码更加健壮,扩展性更好,逻辑也更加清晰。
设计模式一书针对不同的应用场景,列出了各自的最佳实践。随着技术的不断发展,可能一些范例已经不再适用,但是这本书带给我们思想上的指引,意义是非常重大的。设计模式一书,根据应用场景,大致分为建造型、结构型、行为型,总共23种,并提出了6大原则。
本文开始,试着详细介绍每种设计模式,有解释不到位,理解存在偏差的地方,请提出宝贵意见。
行为型-模板模式

模板模式 Template属于行为型中的一种。最直白的解释就是,定义一个顶级的逻辑骨架,封装不变的过程,可变部分由子类自己实现,使代码更容易维护,不需要写重复的过程。
应用场景:定义一系列标准的操作流程,子类可以去实现和重写里面的子方法,流程是在抽象类中定义的。
关键点:定义一个抽象类,设计好整体的流程。
优点:子类可以灵活的重写和扩展框架中的子方法,来实现自己的逻辑。
缺点:由于子类需要实现自己的逻辑,因此会有很多类。
模板方法设计模式是非常常见和容易使用的设计模式,下面使用一个简单的场景来使用一下模版方法模式。场景如下
制作馒头需要取一定重量的水和面,将水和面和均匀后,放置一段时间,将面分成相等的面团,然后制作成圆形,放到蒸锅中蒸熟。
制作包子需要取一定重量的水和面,将水和面和均匀后放置一段时间,取一些蔬菜和肉剁成馅,将面分成相等的面团然后制作成包子形状,放到蒸锅中蒸熟
分析:
上面的场景非常傻的模拟了两种面食的制作过程,如果我们用代码实现上面两种面食的制作过程,应该如何实现?
经过简单的分析发现:制作馒头和包子都需要水和面,都需要将面分成相等的面团,都需要放入蒸锅中蒸熟。不同的是制作包子还需要使用肉馅。下面我试着用模版模式来实现一下上面的代码:
定一个制作面食的模板类:里面定义了制作面食的一系列方法:
package com.daboluo.template.v1;/** * 抽象的面食制作类 * * @author leishufeng * @version 1.0 */public abstract class AbstractPasta {    private final float water;    private final float flour;    public AbstractPasta(float water, float flour) {        this.water = water;        this.flour = flour;    }    public void doPasta() {        System.out.println("=============开始制作面食!===============");        System.out.println("第一步:");        prepare();        System.out.println("第二步:");        makeNoodles();        System.out.println("第三步:");        cut();        System.out.println("第四步:");        make();        System.out.println("第五步:");        steam();        System.out.println("第六步:");        outOfThePot();        System.out.println("=============面食制作完成!===============");    }    public void prepare() {        System.out.println("加入水:" + water + " ml, 加入面:" + flour + " 两!");    }    public void makeNoodles() {        System.out.println("将水和面和均匀!并放置一段时间!");    }    public void cut() {        System.out.println("将面分成相等的面团!");    }    /**     * 制作面食     */    public abstract void make();    public void steam() {        System.out.println("将面食蒸熟!");    }    public void outOfThePot() {        System.out.println("出锅!");    }}
馒头类:
package com.daboluo.template.v1;/** * 馒头类 * * @author leishufeng * @version 1.0 */public class SteamedBread extends AbstractPasta{    public SteamedBread(float water, float flour) {        super(water, flour);    }    @Override    public void make() {        System.out.println("将面团揉成圆形或者自己喜欢的图形!");    }}

包子类:

package com.daboluo.template.v1;/** * 包子类 * * @author leishufeng * @version 1.0 */public class Bun extends AbstractPasta {    private final float vegetables;    private final float meat;    public Bun(float water, float flour, float vegetables, float meat) {        super(water, flour);        this.vegetables = vegetables;        this.meat = meat;    }    @Override    public void prepare() {        super.prepare();        System.out.println("将蔬菜:" + vegetables + " 斤, 肉:" + meat + " 两!剁成肉馅");    }    @Override    public void make() {        System.out.println("将面团和肉馅包成包子形状!");    }}

测试类:

package com.daboluo.template.v1;/** * 测试类 * * @author leishufeng * @version 1.0 */public class Main {    public static void main(String[] args) {        AbstractPasta steamedBread = new SteamedBread(1,2);        AbstractPasta bun = new Bun(2,3,4,1);        steamedBread.doPasta();        bun.doPasta();    }}

输出结果:

=============开始制作面食!===============第一步:加入水:1.0 ml, 加入面:2.0 两!第二步:将水和面和均匀!并放置一段时间!第三步:面分成相等的面团!第四步:将面团揉成圆形或者自己喜欢的图形!第五步:将面食蒸熟!第六步:出锅!=============面食制作完成!============================开始制作面食!===============第一步:加入水:2.0 ml, 加入面:3.0 两!将蔬菜:4.0 斤, 肉:1.0 两!剁成肉馅第二步:将水和面和均匀!并放置一段时间!第三步:面分成相等的面团!第四步:将面团和肉馅包成包子形状!第五步:将面食蒸熟!第六步:出锅!=============面食制作完成!===============

可以看到,上面的代码可以正确的制作包子和馒头,在我应用抽象类将制作面食的过程封装完毕后,实际的子类只需要将不完全一样或者自己特殊的部分单独实现即可,非常简单清晰。

总结:

模板方法模式是很容易应用,且应用很广泛的设计模式之一,上面用伪代码的形式,模拟实现了一个模版方法,感兴趣的自己应用一下吧。

代码比较粗糙,有问题欢迎指正,共同学习。


设计模式不是为了生搬硬套,应该根据实际情况,灵活的运用,后面会介绍更多的设计模式和设计原则,欢迎大家一起讨论学习。

欢迎我们

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材