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


相关推荐

  • pytest运行_ios12自动清理缓存

    pytest运行_ios12自动清理缓存前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月28日
    7
  • vue 二维码生成_二维码图片生成器

    vue 二维码生成_二维码图片生成器本文主要介绍vue生成二维码一、qrcode1.1效果图npminstall–saveqrcodejs21.2关键代码<template> <divclass=”qrcode”ref=”qrCodeUrl”></div></template><script>importQRCodefrom’qrcodejs2’exportdefault{name:”Index”,data(){.

    2022年10月3日
    2
  • reference preparation_Preferences

    reference preparation_Preferences在上篇文章中我们讲述的是Android5.1Settings的源码解析http://blog.csdn.net/dongxianfei/article/details/51979922,其中在介绍到Android的SubSetting时,我们说到基本上都是使用的PreferenceFragment技术,今天我们就来了解一下关于PreferenceFragment相关的技术吧。

    2022年9月7日
    2
  • idea替换内容快捷键_intellij快捷键

    idea替换内容快捷键_intellij快捷键ctrl+r:当前文件内容替换,指的是在当前打开的文件中替换匹配的字符,只操作一个文件。ctrl+shift+r:在路径中替换,指的是在选定的目录下或者类包下,查找要被替换的字符,再在第二个输入框中输入要替换的字符,点击弹出框的右下角的replace或者replaceall即可。…

    2022年9月29日
    4
  • webservice有哪些框架_前端主流js框架

    webservice有哪些框架_前端主流js框架Webservice框架CXF最新版本:2.2.2开源服务框架,可以通过API,如JAX-WS,构建和开发服务。服务可以使多种协议的,例如SOAP,XML/HTTP,RESTfulHTTP, CORBA,并可以工作与多种传输协议之上,如HTTP,JMS,JBI。主要特性l 支持Webservice标准:包括SOAP,theBasicProfile,WSDL,WS-Addres…

    2022年9月21日
    5
  • Python里divmod_python yield函数

    Python里divmod_python yield函数前言我们都知道,python中//代表整数运算中的取整,%代表整数运算中的取余,那么有什么函数可以同时取到整数和余数吗?答案是有的,使用python内置函数divmoddivmod首先看一下源

    2022年7月29日
    9

发表回复

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

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