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申请软件著作权

    软件著作权 源码_python申请软件著作权申请软件著作权时需要清除代码中的注释,可以通过word和Notepad++组合操作来快速的完成1。使用word的插入文件功能合并多个源代码文件,操作方法为:新打开1个word文件,在“插入”标签栏下找到“对象”点击右边的小三角下拉菜单里选择“文件中的文字…”,然后在跳出来的文件选择对话框里选择要合并的文件,如果对话框里没有显示出需要的文件,可能是文件类型过滤器选择的不对,更改为“所有文件…

    2022年9月13日
    0
  • group by 和 order by 的区别 + 理解过程

    group by 和 order by 的区别 + 理解过程orderby和groupby的区别order by 和 group by 的区别:1,order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。2,group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。注意:聚合函数是—sum()、count()、…

    2022年5月9日
    37
  • 5G NR 逻辑信道、传输信道和物理信道

    5G NR 逻辑信道、传输信道和物理信道无线接口可分为三个协议层:物理层(L1)、数据链路层(L2)和网络层(L3)。L1:主要用于为高层业务提供传输的无线物理通道。L2:包括四个子层MAC(MediumAccessControl)媒体接入控制RLC(RadioLinkControl)无线链路控制PDCP(PacketDataConvergenceProtocol)分组数据汇聚协议SDAP(ServiceD…

    2022年5月23日
    38
  • pycharm怎么设置中文版_如何把pycharm改成中文版

    pycharm怎么设置中文版_如何把pycharm改成中文版Pycharm设置中文版注意:1.只有最新版才支持。要2021.1月份后的Pytharm版本。2.要激活自己淘宝。步骤:1.打开pycharm。选择”文件-设置”.2.选择”插件“,搜索”chinese“,安装如图所示。3.安装安城后重启即可。…

    2022年8月26日
    5
  • Vue学习之过滤器的使用

    Vue学习之过滤器的使用Vue学习之过滤器的使用

    2022年4月23日
    63
  • c#获取当前应用程序所在路径

    一、获取当前文件的路径1.System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName获取模块的完整路径,包括文件名。2.

    2021年12月25日
    41

发表回复

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

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