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();
     }
}

 

三、模板方法模式小结:

1、优点:

(1)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

(2)模板方法模式在定义了一组算法,将具体的实现交由子类负责。

(3)模板方法模式是一种代码复用的基本技术。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

2、缺点:

每个不同的实现都需要定义一个子类,导致类的个数的增加,使得系统更加庞大,设计更加抽象。

3、适用场景:

(1)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

(2)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

(3)控制子类扩展,子类必须遵守算法规则。
 

参考博客链接:

https://blog.csdn.net/chenssy/article/details/9634521

https://blog.csdn.net/jason0539/article/details/45037535

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JQuery学习—JQuery的Validform学习

    JQuery的Validform学习

    2022年2月24日
    53
  • bit rate / frame rate /sample rate等等

    bit rate / frame rate /sample rate等等原文地址码率:Bit Rate,指视频或音频文件在单位时间内使用的数据流量,该参数的单位通常是Kbps,也就是千比特每秒。通常2000kbps~3000kbps就已经足以将画质效果表现到极致了。码率参数与视频文件最终体积大小有直接性的关系。 (编码码率—软件)  混合码率:Overall Bit Rate,指视频文件中视频和音频混合后的整体平均码率。一般描述一个视频文件的码率都是指

    2022年10月17日
    3
  • goland-2022.01激活码_在线激活2022.02.22「建议收藏」

    (goland-2022.01激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlHCIQ56F36O-eyJsa…

    2022年4月1日
    68
  • 国内时间同步 ntp服务器地址

    国内时间同步 ntp服务器地址国内时间同步ntp服务器地址ntp.sjtu.edu.cn202.120.2.101(上海交通大学网络中心NTP服务器地址)s1a.time.edu.cn北京邮电大学s1b.time.edu.cn清华大学s1c.time.edu.cn北京大学s1d.time.edu.cn东南大学s1e.time.edu.cn清华大学s2a.time.edu.cn清华大学s2b.t…

    2022年5月2日
    57
  • 如何在 Python 中使用断点调试

    如何在 Python 中使用断点调试实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。–林纳斯·托瓦兹(Linux之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被称作调试,又叫 debug。 刚接触编程的人,往往对调试代码没有很深的认识,觉得把功能做出来就完事了。一旦程序运行出现问题,便无从下手。而实际开发中,调试代码通常要花费比新编写代码更多的时间。所谓“行百里者半于九十”,这句…

    2022年5月21日
    47
  • vs2019 注册码_vs2019怎么激活密钥

    vs2019 注册码_vs2019怎么激活密钥VS2019正式版注册码秘钥VisualStudio2019EnterpriseBF8Y8-GN2QH-T84XB-QVY3B-RC4DFVisualStudio2019ProfessionalNYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y

    2022年10月13日
    3

发表回复

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

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