Java设计模式之行为型:模板方法模式

Java设计模式之行为型:模板方法模式

一、什么是模板方法模式:

        模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟到子类中实现,只需将特性部分在父类中声明成抽象方法即可,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,不同的子类可以以不同的方式来实现这些逻辑。

        模板方法模式的优点在于符合“开闭原则”,也能够实现代码复用,将不变的行为转移到父类,去除子类中的重复代码。但是缺点是不同的实现都需要定义一个子类,导致类的个数的增加使得系统更加庞大,设计更加抽象。

        模板方法是一个方法,那么他与普通方法有什么不同呢?模板方法是定义在抽象类中,把基本操作方法组合在一起形成一个总算法或者一组步骤的方法。而普通的方法是实现各个步骤的方法,我们可以认为普通方法是模板方法的一个组成部分。

UML结构图:

Java设计模式之行为型:模板方法模式

  • 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
  • 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

二、模式实现:

举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。

抽象类AbstractClass:

//抽象类定义整个流程骨架
public abstract class AbstractPerson{
     //模板方法,使用final修改,防止子类改变算法的实现步骤
     public final void prepareGotoSchool(){
          dressUp();
          eatBreakfast();
          takeThings();
     }
     //以下是不同子类根据自身特性完成的具体步骤
     protected abstract void dressUp();
     protected abstract void eatBreakfast();
     protected abstract void takeThings();
}

具体类ConcreteClass:

public class Student extends AbstractPerson{
     @Override
     protected void dressUp() {
          System.out.println(“穿校服");
     }
     @Override
     protected void eatBreakfast() {
          System.out.println(“吃妈妈做好的早饭");
     }
 
     @Override
     protected void takeThings() {
          System.out.println(“背书包,带上家庭作业和红领巾");
     }
}
public class Teacher extends AbstractPerson{
     @Override
     protected void dressUp() {
          System.out.println(“穿工作服");
     }
     @Override
     protected void eatBreakfast() {
          System.out.println(“做早饭,照顾孩子吃早饭");
     }
 
     @Override
     protected void takeThings() {
          System.out.println(“带上昨晚准备的考卷");
     }
}
public class Client {
     public static void main(String[] args) {
     Student student = new Student()
     student.prepareGotoSchool();
 
     Teacher teacher  = new Teacher()
     teacher.prepareGotoSchool();
     }
}


设计模式系列文章:

Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

Java设计模式之创建型:建造者模式

Java设计模式之创建型:单例模式

Java设计模式之创建型:原型模式

Java设计模式之结构型:适配器模式

Java设计模式之结构型:装饰器模式

Java设计模式之结构型:代理模式

Java设计模式之结构型:桥接模式

Java设计模式之结构型:外观模式

Java设计模式之结构型:组合模式

Java设计模式之结构型:享元模式

Java设计模式之行为型:策略模式

Java设计模式之行为型:模板方法模式

Java设计模式之行为型:责任链模式

Java设计模式之行为型:观察者模式

Java设计模式之行为型:访问者模式

Java设计模式之行为型:中介者模式

Java设计模式之行为型:命令模式

Java设计模式之行为型:状态模式

Java设计模式之行为型:备忘录模式

Java设计模式之行为型:迭代器模式

Java设计模式之行为型:解释器模式


参考博客链接:

设计模式读书笔记—–模板方法模式_chenssy 的技术博客-CSDN博客

Java设计模式之模板方法模式(Template Method)_一个本科小生的奋斗史-CSDN博客_java 模板方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114644.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月4日 下午6:00
下一篇 2021年10月4日 下午6:00


相关推荐

  • Java中常用的设计模式

    Java中常用的设计模式文章转载借鉴:http://blog.csdn.net/zhangerqing一、什么是设计模式设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块…

    2022年7月8日
    20
  • Java设计模式之行为型:命令模式

    Java设计模式之行为型:命令模式

    2021年10月4日
    39
  • C++23种设计模式(21)-访问者模式

    C++23种设计模式(21)-访问者模式访问者模式 表示一个作用于某对象结构中的各元素的操作 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 访问者模式适用于数据结构相对稳定的系统 它把数据结构和作用于结构上的操作之间耦合解脱开 使得操作几何可以相对自由地演化 访问者模式的目的使要把处理从数据结构中分离出来 很多系统可以按照算法和数据结构分开 如果这样的系统有比较稳定的数据结构 又有易于变化的算法的话 使用访问者模式就是比较合适的 include iostream include list list iostream

    2026年3月17日
    2
  • 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型)设计模式 八 装饰器模式 Decorator 结构型 1 概述若你从事过面向对象开发 实现给一个类或对象增加行为 使用继承机制 这是所有面向对象语言的一个基本特性 如果已经存在的一个类缺少某些方法 或者须要给方法添加更多的功能 魅力 你也许会仅仅继承这个类来产生一个新类 这建立在额外的代码上 通过继承一个现有类可以使得子类在拥有自身方法的同时

    2026年3月19日
    1
  • Java常用的设计模式

    Java常用的设计模式

    2021年5月5日
    111
  • 设计模式——门面模式「建议收藏」

    设计模式——门面模式「建议收藏」今天我们继续来学习前面没有学完的结构型设计模式中的一种:门面模式。门面模式也是一种不太常用的设计模式。所以,我们今天依旧是了解为主,暂时不去深入的学习。概述门面模式:(FacadeDesignPattern)门面模式也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。门面模式原理和实现也比较简单,应用场景也比较明确,主要在接口设计方面使用。何时使用:解决易用性问题。解决性能问题。解决分布式事务问题。UML类图:角色组成:门面角色:客户端调用这个

    2025年6月6日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号