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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 全网最全Python学习路线图+14张思维导图,让python初学者不走弯路![通俗易懂]

    全网最全Python学习路线图+14张思维导图,让python初学者不走弯路![通俗易懂]        最近忙着做大数据的项目,故有一段时间没更新Python专栏的内容了。        突发奇想,想把当初自学python时收藏的关于python的14张思维导图和学习路线拿出来分享给许多同样处于”初级”阶段的各位攻城狮们。…

    2022年6月7日
    46
  • Windows Server 2008 防火墙开放 Oracle 的1521端口

    Windows Server 2008 防火墙开放 Oracle 的1521端口在防火墙的入站规则中,新建端口规则。过程如下例图片所示:同理可以开放EM用的1158端口。执行完后用下面命令测试telnetSERVER_IP1521参考资料[1]WindowsServer2008防火墙如何配置(5).http://www.bitscn.com/netpro/firewall/200711/118934_

    2022年5月9日
    187
  • Tomcat中的ResourceBundle国际化解析「建议收藏」

    Tomcat中的ResourceBundle国际化解析「建议收藏」一、ResourceBundle简介:资源束(ResourceBundle)是一个本地化对象。它封装了适用于本地环境的资源;这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。比如对于“取消”,中文中我们使用“取消”来表示,而英文中我们使用“cancel”。若我们的程序是面向国际的…

    2022年7月12日
    14
  • Linux安装redis和redis安装常见错误

    Linux安装redis和redis安装常见错误

    2021年11月23日
    35
  • 非常详细的rsyslogd配置文件解析

    非常详细的rsyslogd配置文件解析Rsyslog配置文件详解发表于2年前(2014-02-1017:25)  阅读(9805) | 评论(3) 10人收藏此文章, 我要收藏赞1rsyslog服务和logrotate服务======================================================================rsyslog是一个sysl

    2022年8月15日
    5
  • 电脑硬件基础知识科普「建议收藏」

    电脑硬件基础知识科普「建议收藏」电脑的类型电脑可分为台式电脑、笔记本电脑、平板电脑(也有资料不将平板电脑算作电脑,但本博客暂时将它算作电脑),其中,台式电脑又可以分为一体式与分体式两种,一体式电脑即将主机、显示器及其他部件整合在一起的新式电脑、其亮点在于元件的高度集成,分体式电脑即为常见的台式电脑,由主机与显示器等部件组成。笔记本电脑(NoteBook)又称膝上电脑、手提电脑。平板电脑(又称TabletPC):一种小型且方便…

    2022年9月7日
    0

发表回复

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

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