您好,登录后才能下订单哦!
本篇内容主要讲解“Java模板方法模式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java模板方法模式是什么”吧!
什么是模板方法模式
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.
Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
模板方法模式(Template Method Pattern):定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式属于行为型模式,主要使用Java的继承机制来实现。
模板方法,顾名思义就是一个模板,按照模板做事,模板方法里封装了方法的执行步骤,调用方只需要通过调用模板就能按照正确的顺序把事情做好。
模板方法模式的两个角色
AbstractClass(抽象类):定义了一系列基本操作(PrimitiveOperations),这些基本操作(方法)可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中定义了一个模板方法(Template Method),也就是定义了一个算法的框架,并定义组合好了这些操作的执行顺序。
ConcreteClass(具体子类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
模板方法模式UML图
模板方法模式代码演示
有小伙伴要问了,模板方法模式和莫雷事件有什么关系吗?他们二者之间本身并没有任何关联,我是在观察大家在面对这件事的态度,以及我们表达我们观点所采用的方式。再抽象一下,我们每个人对这件事的行为是不是可以简单的抽象成,打开社交软件,发表观点和意见、关闭社交软件。这是什么?运用到项目上来看,这不就是一个模板方法吗?大家都是按照这个模板在表达观点,不同的是有的人用的微博,有的人用的虎扑,有的用的推特,有的支持莫雷,有的骂莫雷等等。我们来看一下代码实现。
1、编写抽象模板类
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 抽象模板类 * </p> * * @author Moore * @ClassName Comment. * @Version V1.0. * @date 2019.10.16 11:53:02 */public abstract class Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected abstract void openSocialSoftware(); /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected abstract void comment(); /** * <p class="detail"> * 功能: 具体方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected void closeSocialSoftware(){ System.out.println("关闭社交软件"); } /** * <p class="detail"> * 功能: 模板方法,模板方法,为了防止恶意的操作,一般模板方法都加上final关键字,子类不可实现 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ public final void temtemplateMethod(){ openSocialSoftware(); comment(); closeSocialSoftware(); }}
2、编写具体类
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具体类 * </p> * * @author Moore * @ClassName Zhang san. * @Version V1.0. * @date 2019.10.16 14:00:09 */public class ZhangSan extends Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void openSocialSoftware() { System.out.println("打开微博!"); } /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void comment() { System.out.println("评论是:莫雷必须道歉,肖华必须道歉!解雇莫雷!"); }}
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具体类 * </p> * * @author Moore * @ClassName Li si. * @Version V1.0. * @date 2019.10.16 13:59:56 */public class LiSi extends Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void openSocialSoftware() { System.out.println("打开虎扑"); } /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void comment() { System.out.println("评论是:莫雷是傻X,WQNMLGB"); }}
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具体类 * </p> * * @author Moore * @ClassName James. * @Version V1.0. * @date 2019.10.16 13:59:01 */public class James extends Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void openSocialSoftware() { System.out.println("打开推特"); } /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void comment() { System.out.println("评论是:肖华应该惩罚莫雷!"); }}
3、客户端调用
package com.mazhichu.designpatterns.templatemethod;public class Client { public static void main(String[] args) { Comment zhangSan = new ZhangSan(); zhangSan.temtemplateMethod(); System.out.println("-----------------\n"); Comment lisi = new LiSi(); lisi.temtemplateMethod(); System.out.println("-----------------\n"); Comment james = new James(); james.temtemplateMethod(); }}
查看运行结果:
上面就是模板方法模式,可能是最常见也是最简单的设计模式了,父类(抽象类)定义算法和模板方法,模板方法约定好算法执行顺序,子类只需要实现父类的抽象算法,就能按照模板方法既定的顺序执行得到不同的结果,这样做大大简化了子类的复杂度。
钩子方法
为什么把这个单独拿出来说,是因为在模板方法中有些方法是否执行是可选的,也就是不是所有模板中的算法都需要被执行,可以由子类来决定,这就是我们要说的“钩子方法”。
钩子方法是一种被声明在抽象类中的方法,一般是空实现或者有默认值,子类可以实现覆盖该钩子,来决定算法步骤的某一步骤是否要执行,这是一种反向控制。
我们来改造一下抽象类,加入钩子方法。
1、重新抽象类,加入钩子方法
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 抽象模板类 * </p> * * @author Moore * @ClassName Comment. * @Version V1.0. * @date 2019.10.16 11:53:02 */public abstract class Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected abstract void openSocialSoftware(); /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected abstract void comment(); /** * <p class="detail"> * 功能: 具体方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ protected void closeSocialSoftware(){ System.out.println("关闭社交软件"); } /** * <p class="detail"> * 功能: 模板方法,为了防止恶意的操作,一般模板方法都加上final关键字,子类不可实现 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ public final void temtemplateMethod(){ openSocialSoftware(); if(isLogin()){ comment(); }else { System.out.println("您未登录,不可以发表评论哦,只能看别人骂莫雷"); } closeSocialSoftware(); } /** * 钩子方法:可以是抽象方法,空实现或默认实现,子类可以覆写来决定模板方法是否执行某些算法 * @return */ protected boolean isLogin(){ System.out.println("登录后才可以评论---"); return true; }}
2、编写一个覆盖钩子方法的子类
package com.mazhichu.designpatterns.templatemethod;public class LaoBao extends Comment { /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void openSocialSoftware() { System.out.println("打开知乎"); } /** * <p class="detail"> * 功能: 基本抽象方法 * </p> * * @author Moore * @date 2019.10.16 11:53:02 */ @Override protected void comment() { System.out.println("我不但想骂莫雷肖华,还想问候川普"); } @Override protected boolean isLogin() { return false; }}
3、客户端调用
package com.mazhichu.designpatterns.templatemethod;public class Client { public static void main(String[] args) { Comment zhangSan = new ZhangSan(); zhangSan.temtemplateMethod(); System.out.println("-----------------\n"); Comment lisi = new LiSi(); lisi.temtemplateMethod(); System.out.println("-----------------\n"); Comment james = new James(); james.temtemplateMethod(); System.out.println("-----------------\n"); Comment laobao = new LaoBao(); laobao.temtemplateMethod(); }}
4、查看运行结果:
通过结果可以得出,加入钩子方法后,可以反向控制父类中的模板方法中某些算法是否要被执行,这样也增加了模板方法的灵活性。
到此,相信大家对“Java模板方法模式是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。