专栏首页低调小熊猫设计模式之模板方法模式

设计模式之模板方法模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。

模板方法模式

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

我们先炒两个菜

/** * 炒个西红柿 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookXihongshi {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    public void doCook(){        System.out.println("西红柿炒蛋");    }    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    public void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}
/** * 炒个青菜 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookVegetable {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    public void doCook(){        System.out.println("炒青菜");    }    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    public void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}

炒青菜的类和上面西红柿炒蛋的类一比较,你会发现除了 doCook() 方法中具体的实现不一样之外,其他步骤都是完全一模一样的。解决办法很简单,将重复代码抽出来让父类去实现,而西红柿炒蛋和炒青菜都继承它,这样就避免了重复代码:

使用

/** * 抽象父类 两个地方是关键,一是 doCook() 使用 abstract 修饰,让子类去实现。二是 cook() 方法使用 final 关键字修饰,防止子类重写,从而破坏了模板中规定好的流程。 * @author aodeng-低调小熊猫 * @since 19-7-18 */public abstract class Cook {    public void open(){        System.out.println("打开抽油烟机");    }    public void fire(){        System.out.println("生火");    }    /**     * 期望子类去实现     */    public abstract void doCook();    public void outfire(){        System.out.println("灭火");    }    public void close(){        System.out.println("关闭抽油烟机");    }    /**     * 使用final关键字,防止子类重写     */    public final void cook(){        this.open();        this.fire();        this.doCook();        this.outfire();        this.close();    }}
/** * 子类重写 实现要炒的菜 西红柿炒蛋 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookXihongshi2 extends Cook {    @Override    public void doCook() {        System.out.println("西红柿炒蛋");    }}
/** * 子类重写 实现要炒的菜 炒青菜 * @author aodeng-低调小熊猫 * @since 19-7-18 */public class CookVegetable2 extends Cook {    @Override    public void doCook() {        System.out.println("炒青菜");    }}

测试

        System.out.println("Hello World!");        Cook cook = new CookXihongshi2();        cook.cook();        Cook cook1=new CookVegetable2();        cook1.cook();        /* ===== 控制台输出Hello World!打开抽油烟机生火西红柿炒蛋灭火关闭抽油烟机打开抽油烟机生火炒青菜灭火关闭抽油烟机*/

看到这里,没错,你已经学会了模板方法模式。模板方法是设计模式中较好理解的一种,它的使用场景是:当有一个业务有 N 个步骤( 模板 ),其中一部分步骤是永恒不变的,那么就将不变的这些步骤抽象到父类中,可能变化的步骤留给子类去实现。

本文分享自微信公众号 - 低调小熊猫(Mr_AoDeng),作者:aodeng

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot(十四):CommandLineRunner-初始化资源

    CommandLineRunner接口的Component会在spring bean初始化之后,SpringApplication run之前执行,可以控制在项...

    低调小熊猫
  • 经典设计模式(一):策略模式

    写出可维护、可复用、可扩展及灵活的代码是我们的目的,也是学习设计模式的理由,这句话是他娘的复制的,为什么要学设计模式,设计模式是什么,还是去百度一下吧,我就不装...

    低调小熊猫
  • java中的万能实体类

    低调小熊猫
  • 09(01)总结final,多态,抽象类,接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量。 (2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写。 ...

    Java帮帮
  • Java设计模式之桥梁模式

    梦想中的我自己,身价过亿,有两个大公司,一个是房地产公司,一个是服装制造公司,其实是什么公司我倒是不关心,我关心的是它赚不赚钱,赚了多少,这才是我关心的。先用类...

    CoderJed
  • SpringMVC快速使用AOP

    最近突然想到了AOP编程,于是在自己的SpringMVC小项目中引入了。AOP一般用来做些什么呢?这里简单的使用AOP做拦截日志,来介绍下在SpringMVC中...

    幽鸿
  • 设计模式之模板方法模式(一)

    学习了前面的朋友都知道,目前为止,我们的议题都是绕着封装转;我们已经封装了对象创建、方法调用、复杂接口、鸭子、比萨…那接下来呢?

    程序员小跃
  • Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

    在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在...

    朝雾轻寒
  • Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

    在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在...

    朝雾轻寒
  • java设计模式(7)-外观模式

    上篇文章分享代理模式,这篇整理外观模式,外观模式可以降低类与类之间的耦合程度,减少维护工作量

    爱敲代码的猫

扫码关注云+社区

领取腾讯云代金券