模板方法模式 约定不等于承诺〃 2021-10-15 06:45 366阅读 0赞 生活中有很多按步骤才能完成的事,比如我们想进房间,需要先将门打来,然后才能进去,进去之后再把门关上。开门和关门是固定的步骤,而进入房间的步骤则不是固定的,它可以有多种方式,走着进去、跑着进去、跳着进去等都可以。类似这种多个步骤才能完成的事,在软件世界称之为模板方法模式 **模板方法模式(Template Method Pattern):**定义了一个操作中的算法框架,并将一些步骤延迟到子类中。使得子类在不改变算法结构的情况下,重新定义算法的某些步骤。模板方法是一种类行为型模式 完成模板方法模式需要2个角色 抽象类(AbstractClass):定义了一系列基本操作,这些操作可以是具体的,也可以是抽象的。在抽象类中实现一个模板方法,用于定义一个算法框架 具体子类(ConcreteClass):抽象类的子类,实现父类中声明的抽象方法 下面代码演示模板方法模式 定义抽象类 相关说明在代码中 package com.design.behavioral.templatemethod; /** * 抽象类 */ public abstract class AbstractClass { private boolean isEffective = false; /** * 通过构造设置钩子方法返回值 * @param isEffective */ public AbstractClass(boolean isEffective) { this.isEffective = isEffective; } /** * 固定方法,设置成 final */ public final void primitiveOPeration1(){ System.out.println("开始执行"); } /** *有默认实现,可以被子类重写的方法 */ public void primitiveOPeration2(){ System.out.println("默认执行,可被重写"); } /** * 钩子方法 * @return */ public boolean isEffective(){ return isEffective; } /** * 被钩子方法控制的方法 */ public void effectiveOPeration(){ System.out.println("是否有效操作"); } /** * 抽象方法,有子类实现 */ public abstract void primitiveOPeration3(); /** * 固定方法,设置成 final */ public final void primitiveOPeration4(){ System.out.println("结束执行"); } /** * 模板方法,定义算法骨架,内部流程固定不变 */ public final void templateMethod(){ this.primitiveOPeration1(); this.primitiveOPeration2(); if (this.isEffective()){ this.effectiveOPeration(); } this.primitiveOPeration3(); this.primitiveOPeration4(); } } 具体子类. package com.design.behavioral.templatemethod; /** * 具体子类 */ public class ConcreteClass extends AbstractClass{ public ConcreteClass(boolean isEffective) { super(isEffective); } @Override public void primitiveOPeration3() { System.out.println("子类实现操作"); } } 类图如下 ![20190813142413584.png][] 测试调用 package com.design.behavioral.templatemethod; /** * 模板方法模式 */ public class TestMain { public static void main(String[] args) { AbstractClass abstractClass = new ConcreteClass(true); abstractClass.templateMethod(); } } 调用结果 ![20190813142519933.png][] **模板方法模式总结** 优点:父类定义算法,子类实现细节处理,保证了步骤的执行次序;提高代码复用性;通过钩子方法,实现子类对父类的反向控制;符合开闭原则 缺点:每一个基本方法的不同实现都需要一个子类,因此将导致类的数目增加;增加系统实现的复杂度;如果父类中增加新方法,则所有的子类都需要修改 适用场景:对复杂的算法进行分割,一次性实现算法不变的部分,将可变的行为留给子类实现;将各个子类中的公共行为提取出来并集中到一个公共父类,避免代码重复;需要通过子类决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制 [20190813142413584.png]: /images/20211015/a64fa42c7d624db8a1459df533f59fb0.png [20190813142519933.png]: /images/20211015/c71b607ee55f4feba42e9fcacb3ed45a.png
相关 模板方法模式 在微软的WebCast上,李建中老师有个设计模式的系列讲座,其中在讲到模板方法(Template Method)曾说:如果你只想学习一种设计模式就学习模板方法吧。由此可见它使用 我不是女神ヾ/ 2022年09月19日 00:17/ 0 赞/ 9 阅读
相关 模板方法模式 模板方法模式会将模板方法以及不需要随业务场景变化的基本方法放到父类中实现,随业务场景变化的基本方法会被定义为抽象方法,由子类提供真正的实现。 下图展示了模板方法模式的核心类, 野性酷女/ 2022年09月10日 11:24/ 0 赞/ 21 阅读
相关 模板方法模式 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法的结构的情况下,重新定义算法中的某些步骤。 模板方法模式类图: ![ 小鱼儿/ 2022年06月03日 02:41/ 0 赞/ 41 阅读
相关 模板方法模式 一、描述 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的 素颜马尾好姑娘i/ 2022年06月03日 01:08/ 0 赞/ 19 阅读
相关 模板方法模式 引入一个例子 ![在这里插入图片描述][70] 比如冲咖啡和冲茶两个过程,加工方法似乎都差不多。可以看成如下过程: 把水煮沸boil()->冲泡brew()->倒 约定不等于承诺〃/ 2022年05月06日 10:38/ 0 赞/ 71 阅读
相关 模板方法模式 最近看书又遇到模板方法模式,具体是在同步器(AQS)的内容上。就顺便再来回顾下。 同步器AbstractQueuedSynchronizer(AQS)是一个抽象类。其中定义了 墨蓝/ 2021年10月18日 11:34/ 0 赞/ 332 阅读
相关 模板方法模式 生活中有很多按步骤才能完成的事,比如我们想进房间,需要先将门打来,然后才能进去,进去之后再把门关上。开门和关门是固定的步骤,而进入房间的步骤则不是固定的,它可以有多种方式,走着 约定不等于承诺〃/ 2021年10月15日 06:45/ 0 赞/ 367 阅读
相关 模板方法模式 什么叫做模板方法模式? 在定义功能时,功能的一部分是确定的但是有一部分是不确定的,而确定的部分在使用不确定的部分。那么这时就将不确定的部分暴露出来,由该类的子类去实现。 清疚/ 2021年09月18日 15:40/ 0 赞/ 398 阅读
相关 模板方法模式 一 点睛 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些 深藏阁楼爱情的钟/ 2021年07月24日 20:53/ 0 赞/ 451 阅读
相关 模板方法模式 在定义功能时,功能的一部分是确定的,一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。 抽象类(AbstractCl... 系统管理员/ 2021年05月03日 16:24/ 0 赞/ 426 阅读
还没有评论,来说两句吧...