likes
comments
collection
share

用做猪脚面的方式,学习下模版方法模式

作者站长头像
站长
· 阅读数 79

模版方法模式

前言

模版方法模式,是行为型设计模式的一种。这个模式的使用频率没有那么高,以至于之前从来没有了解过该模式。不过兄弟们也不用怕,这个模式其实还是比较简单的。等会咱们举个例子,来理解一下这个模式。

介绍

概念理解

模版方法模式,个人理解是,将类中的一些方法执行顺序进行排序。其中的部分方法可以被重写。排序后的方法就是模版方法。排序后的类就是模版类。这种代码设计思路就是模版方法模式

菜谱:猪脚面

上面的描述可能有点抽象。那么咱就换一个讲法来说一下这个模式。

从前呢,在京海市有一条街叫旧厂街,那里呢有一个菜市场,菜市场里有一个卖鱼的小老板他叫高启强。他呢有一个弟弟妹妹。兄妹三人啊从小就喜欢吃猪脚面。但是由于家里穷,所以三人只够吃一碗面。妹妹高启兰吃猪脚,弟弟高启盛吃面,而高启强就只能喝面汤。

由于的确穷,他就去找饭店老板要了一份菜谱。饭店老板看他可怜就给了他一份猪脚面的菜谱,具体如下:

  1. 把水烧开
  2. 放面条
  3. 放猪脚
  4. 放佐料
  5. 把面煮熟

他兴高采烈的按照菜谱做了一份猪脚面,给弟弟妹妹吃。可是结果却让他失望了。因为猪脚面的味道出了问题。

他去找了老板,老板对他说,阿强啊,我给你的菜谱肯定没问题,味道不对一定是哪个环节出错了。

于是他又给老板做了一遍。当他放完佐料的时候。老板立刻叫住了他,对他说。阿强,你其他的步骤都没有错,但是放佐料这一步和我有些不一样。

这一步这里你应该要放的是酱油和老抽,再用盐和鸡精调味。可这里你只用了醋来调味,所以味道不对。高启强满脸通红的对老板说,对不起啊老板,我家太穷类没有那些调理所以只能用醋代替了。

在上面这个例子中,这里面的菜谱就是模板也可以说是框架菜谱执行顺序可以被看作是模板方法。而且这里的执行顺序是固定无法被改变的。 执行顺序无法改变,但是具体的做菜步骤却是可以被重写的。比如说放佐料。

例子中的高启强正是由于这一步的不同,导致他做出的猪脚面和老板的口味不一致。

2023春晚

上面这个可以看作是模版方法模式的一个简单举例。接下来咱们再举个有代码的例子加深下对模版方法模式的印象。

春晚模版类

SpringFestivalGala规定了春晚必须遵循的节目流程。这个代码中的start方法,可以看作是模版方法模式中最重要的一环,因为他就是规定了其他方法调用顺序模版方法

  1. 开场白
  2. 唱歌
  3. 跳舞
  4. 小品
  5. 难忘今宵

由于不同卫视的节目顺序都遵循这套模版。而且最后的节目难忘今宵是春晚保留节目,所以该节目必须所有春晚保持一致,具体代码如下所示:

/**
 * Author(作者):jtl
 * Date(日期):2023/2/10 20:05
 * Detail(详情):春晚流程(春晚模版 )
 */
public abstract class SpringFestivalGala {
    public void start(){
        prologue();
        song();
        dance();
        comedySketch();
        unforgettableTonight();
    }
    //开场白
    public abstract void prologue();
    
    //歌曲节目
    public abstract void song();

    //小品节目
    public abstract void comedySketch();
    
    //舞蹈节目
    public abstract void dance();
    
    //难忘今宵
    private void unforgettableTonight(){
        System.out.println("结尾:难忘今宵");
    }
}

上面的代码中,不同的春晚,有着不同的小品舞蹈等节目,所以需要SpringFestivalGala的子类需要重写这几个方法。但是难忘今宵是所有春晚共同的节目。因此可以复用。而start方法就可以看作是模版方法。它里面的节目执行顺序固定的无法被改变。

辽视春晚

辽宁春晚继承了春晚的固定模版。具体代码如下:

/**
 * Author(作者):jtl
 * Date(日期):2023/2/10 20:42
 * Detail(详情):辽宁春晚
 */
public class SpringFestivalGalaOfLiaoning extends SpringFestivalGala{
    @Override
    public void prologue() {
        System.out.println("开场白:欢迎来到,2023年,辽宁卫视春晚现场");
    }

    @Override
    public void song() {
        System.out.println("歌曲:孙楠,谭维维-追光");
    }

    @Override
    public void comedySketch() {
        System.out.println("小品:宋小宝-杨树林:非常营销");
    }

    @Override
    public void dance() {
        System.out.println("舞蹈:舞蹈-欢庆中国年");
    }
}

央视春晚

央视春晚同样遵循春晚的传统模版。有着开场白,歌曲等精彩的演出。尤其是小品初见照相馆一经播出,一己之力推动年轻人的离婚率,简直是今年节目之最!央视春晚的具体代码如下:

/**
 * Author(作者):jtl
 * Date(日期):2023/2/10 20:53
 * Detail(详情):CCTV 央视春晚
 */
public class CCTVSpringFestivalGala extends SpringFestivalGala{
    @Override
    public void prologue() {
        System.out.println("开场白:欢迎来到,2023年,央视春晚的现场");
    }

    @Override
    public void song() {
        System.out.println("歌曲:邓超-好运全都来");
    }

    @Override
    public void comedySketch() {
        System.out.println("小品:于震-初见照相馆");
    }

    @Override
    public void dance() {
        System.out.println("舞蹈:辽宁芭蕾舞团:我们的田野上");
    }
}

客户端代码

调用这两个类的客户端代码

/**
 * Author(作者):jtl
 * Date(日期):2023/2/10 20:04
 * Detail(详情):模版方法模式客户端
 */
public class Client {
    public static void main(String[] args) {
        CCTVSpringFestivalGala cctv = new CCTVSpringFestivalGala();
        cctv.start();

        System.out.println("----------------分割线----------------");

        SpringFestivalGalaOfLiaoning liaoning = new SpringFestivalGalaOfLiaoning();
        liaoning.start();
    }
}

运行结果

结果如图所示 用做猪脚面的方式,学习下模版方法模式

模版方法模式的模版

  1. 有一个固定的模版类A,它是一个抽象类
  2. 模版类A里有一些方法,这些方法里有需要子类重写的抽象方法
  3. 有一个模版方法,它里面有着这些方法的调用顺序。这个顺序是不能被改变的,也是模版方法模式的核心
  4. 子类继承模版类A,重写它的抽象方法

后记总结

至此,模版方法模式就算是介绍完毕了。细心的小伙伴可能发现了,模版方法模式的模版如果要扩展的话,就必须改了啊,他这违反了开闭原则啊。

没错,这是这个模式的一个缺陷。从模版方法模式的定义来看,它的概念就是给其他类提供一套固定的执行流程,这个执行流程就是模版方法。其他类只能修改其中的方法,不能修改执行流程,即不能修改模版方法。所以它从定义上就不存在修改执行流程这一可能。可能有点强行洗白,但是这也是一种解释方式。

还是那句话,对于设计模式来说,没有固定的套路。毕竟它只是人们经过长时间总结出来的代码经验。所以千万别被所谓的设计模式框架所拘束,只要符合要求,有利阅读扩展就是好的代码。

如果喜欢请点个赞,支持一下。有错误或不同想法请及时指正哈。辛苦您看到这里,下篇文章再见哈,👋👋👋

转载自:https://juejin.cn/post/7199297355748343863
评论
请登录