摘要:模板方法模式定义定义了一个算法的骨架。这里判断了钩子函数的结果来决定是否执行写文章这个方法。提供课程源代码设计模式课程实现类,这里重写了钩子函数,将其返回值设置成。
模板方法模式
定义了一个算法的骨架。并允许子类为一个或多个步骤提供实现。
模板方法是的子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
行为型
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码的重复。
提高复用性,将公共代码放在父类中实现提高了复用性
提高拓展性,通过增加子类来拓展新的行为。
继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要修改。
下面开始写代码,假设一个场景就是我们要制作一套课程,这些课程可能包含一定包含视频ppt,不一定包含文章。
public abstract class ACourse { protected final void makeCourse(){ this.makePPT(); this.makeVideo(); if(needWriteArticle()){ this.writeArticle(); } this.packageCourse(); } final void makePPT(){ System.out.println("制作PPT"); } final void makeVideo(){ System.out.println("制作视频"); } final void writeArticle(){ System.out.println("编写文章"); } //钩子方法 protected boolean needWriteArticle(){ return false; } abstract void packageCourse(); }
这里定义了一个抽象的课程方法。对于那些一定有的内容我们生命成final的,写文章这个方法我们也声明成final,但是我们定义了一个钩子方法,这个钩子方法子类可以重写,对于需要写文章的方法我们就返回true,不需要的我们就返回false。makeCourse方法中定义了执行流程,在最后我们调用了this.packageCourse方法,这个调用其实是在调用子类方法,因为我们这个是交由子类来执行。通过向上转型来调用父类方法,然后this指代是当前对象也就是子类对象,不太明白的话等会儿看接下来的代码就知道了。这里判断了钩子函数的结果来决定是否执行写文章这个方法。
public class DesignPatternCourse extends ACourse { @Override void packageCourse() { System.out.println("提供课程Java源代码"); } @Override protected boolean needWriteArticle() { return true; } }
设计模式课程实现类,这里重写了钩子函数,将其返回值设置成true。这个提供源代码就算是子类自己的实现。
public class FECourse extends ACourse { private boolean needWriteArticleFlag = false; @Override void packageCourse() { System.out.println("提供课程的前端代码"); System.out.println("提供课程的图片等多媒体素材"); } public FECourse(boolean needWriteArticleFlag) { this.needWriteArticleFlag = needWriteArticleFlag; } @Override protected boolean needWriteArticle() { return this.needWriteArticleFlag; } }
这里是前端课程,因为前端是一个大的区域,前端可以分为vue,react等等,所以我们把这个钩子函数也开放出来,只是给一个默认值让应用层自己实现。
public class TemplateMethodTest { public static void main(String[] args) { System.out.println("后端设计模式课程start---"); ACourse designPatternCourse = new DesignPatternCourse(); designPatternCourse.makeCourse(); System.out.println("后端设计模式课程end---"); System.out.println("前端课程start---"); ACourse feCourse = new FECourse(false); feCourse.makeCourse(); System.out.println("前端课程end---"); } }
测试方法,这就讲完了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73020.html
摘要:模板方法模式定义定义抽象类并且声明一些抽象基本方法供子类实现不同逻辑,同时在抽象类中定义具体方法把抽象基本方法封装起来,这就是模板方法模式。 近日,ofo小黄车宣布入驻法国巴黎,正式进入全球第20个国家,共享单车已然改变了我们的出行方式。就拿我自己来说,每当下班出地铁的第一件事,以光速锁定一辆共享单车,百米冲刺的速度抢在别人之前占领它。 而大家都是重复着同样的动作,拿出手机开锁、骑车、...
摘要:重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数详见后面的扩展示例约束其行为。 定义 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.TemplateMethod lets subclasses redefine certai...
摘要:也是一些架构师常用的模式。写出方法,需要子类自己定义穿衣服需要子类自定义洗脸刷牙子类自定义方法出门准备工作需要子类自定义出门穿阿迪吊丝的衣服整理文件,找工作恩,这个模板,差不多能满足正常人的需求。 所谓的模板就是一个重用一万次都不会觉得有问题的代码。 在es6中,提出了一个 ``反引号的书写方式--又叫做模板字符串.他最大的功能就是用来书写模板html的.通常在js中使用模板是 T...
摘要:前言本系列文章主要根据设计模式与开发实践整理而来,其中会加入了一些自己的思考。模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。 前言 本系列文章主要根据《JavaScript设计模式与开发实践》整理而来,其中会加入了一些自己的思考。希望对大家有所帮助。 文章系列 js设计模式--单例模式 js设计模式--策略模式 js设计模式--代理模式 js设计模式--迭...
阅读 1223·2021-09-01 10:30
阅读 2100·2021-07-23 10:38
阅读 871·2019-08-29 15:06
阅读 3057·2019-08-29 13:53
阅读 3261·2019-08-26 11:54
阅读 1775·2019-08-26 11:38
阅读 2352·2019-08-26 10:29
阅读 3109·2019-08-23 18:15