【行为型模式】模板方法模式

一、模板方法模式概述

        模板方法模式定义在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。(类对象型模式)

  • 模板方法中的基本方法是实现算法的各个步骤,是模板方法的组成部分。基本方法又可以分为三种:
    • 抽象方法:抽象方法就是在抽象类中声明并由子类实现的方法;
    • 具体方法:具体方法可以由抽象类实现,或者由子类覆盖实现;
    • 钩子方法:钩子方法可以由抽象类实现,子类可以加以扩展。
      • 钩子方法又分为两类:
        • 第一类钩子方法是可以与一些具体步骤挂钩,以实现在不同条件下执行模板方法的不同步骤,这类方法一般返回boolean,方法名一般为isXXX();
        • 第二类钩子方法是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法
  • 模板方法模式的优缺点
    •  优点: 
      •  1.封装不变部分,扩展可变部分;
      •  2.提取公共代码,便于维护;
      •  3.行为由父类控制,子类实现。
  • 缺点:
    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
  • 使用场景: 
    • 1.有多个子类共有的方法,且逻辑相同;
    • 2.重要的、复杂的方法,可以考虑作为模板方法。

注意事项为防止恶意操作,一般模板方法都加上 final 关键词。

二、代码实现

        模板方法模式有两个角色:

  • AbstractClass(抽象类):抽象类中定义了一系列基本操作,这些操作是具体的也可以是抽象的,每一个基本操作对应算法的一个步骤,在子类中可以重定义或实现这些步骤,同时抽象类实现了一个模板方法,定义一个算法的框架;
  • ConcreteClass(具体子类):实现父类中的抽象基本方法,或者覆盖父类中具体基本操作。
        2.1 抽象类
package Template.common;public abstract class AbstractClass {// 模板方法定义的框架-->这就是模板方法,是final的public final void templateMethod() {/*** 调用基本方法,完成固定逻辑* 基本操作,是由子类实现的方法*/concreteOperattion();primitiveOperation1();primitiveOperation2();if(primitiveOperation3())System.out.println("符合钩子方法条件");elseSystem.out.println("不符合钩子方法条件");primitiveOperation4();}// 抽象类的具体操作,共同的且繁琐的操作private void concreteOperattion() {// do somethingSystem.out.println("子类一定会实现的方法concreteOperattion");}  public void primitiveOperation1(){System.out.println("抽象类具体方法primitiveOperation1");}// 抽象类抽象方法:由子类必须实现的操作protected abstract void primitiveOperation2();//第一类钩子方法public boolean primitiveOperation3(){return false;}//第二类钩子方法:默认不做事的方法,子类可以视情况决定要不要覆盖它public void primitiveOperation4(){}}
        2.2 具体子类
package Template.common;public class ConcreteClass1 extends AbstractClass {@Overridepublic void primitiveOperation2(){System.out.println("可以不实现primitiveOperation3、primitiveOperation4,但是一定有primitiveOperation2");}public boolean primitiveOperation3(){return true;// 如果想钩子方法返回false可以不实现该方法// 因为父类默认返回false// return false;}public void primitiveOperation4(){System.out.println("子类覆盖父类第二类钩子方法");}
}
package Template.common;public class ConcreteClass2 extends AbstractClass {@Overrideprotected void primitiveOperation2() {// TODO Auto-generated method stub//必须继承的类System.out.println("可以不实现primitiveOperation3、primitiveOperation4,但是一定有primitiveOperation2");}}
        2.3 main方法实现模板方法
package Template.common;public class TemplateClient {public static void main(String[] args) {// TODO Auto-generated method stubAbstractClass abstractClass1 = new ConcreteClass1();AbstractClass abstractClass2 = new ConcreteClass2();System.out.println("------ConcreteClass1-------");applyTemplate(abstractClass1);System.out.println("------ConcreteClass2-------");applyTemplate(abstractClass2);}public static void applyTemplate(AbstractClass abstractClass){abstractClass.templateMethod();}}
        2.4 UML图

三、代码结构图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/631082.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

展览展会媒体媒体邀约执行应该怎么做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 展览展会邀请媒体跟其他活动邀请媒体流程大致相同,包括 制定媒体邀约计划,准备新闻稿,发送邀请函,确认媒体参会,现场媒体接待及…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl,得到火车图形 如果没有得到该图形,就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法? 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢? 因为有的问题能暴力…

如何获得合适的助听器?

要获得一个合适的助听器,您可以按照以下步骤进行: 1. 咨询专业医生或听力专家:首先,建议您咨询专业的耳鼻喉科医生或听力专家。他们可以通过听力测试来评估您的听力损失程度和类型,并为您提供个性化的建议。 2. 选择信…

【软考】UML中的图之用例图

目录 1. 说明2. 建模2.1 说明2.2 语境建模2.3 需求建模 3. 图示4. 组成部分 1. 说明 1.用例图(Use Case Diagram)。2.展现了一组用例、参与者(Actor)以及它们之间的关系。3.用例图通常包括以下的内容:用例、参与者、用…

LabVIEW供热管道泄漏监测与定位

LabVIEW供热管道泄漏监测与定位 在现代城市的基础设施建设中,供热管道系统起着极其重要的作用。然而,管道泄漏问题不仅导致巨大的经济损失,还对公共安全构成威胁。因此,开发一种高效、准确的管道泄漏监测与定位技术显得尤为关键。…

基于Bootstrap 4的企业项目体验服务网站模板

目录 一.前言 二.展示 三.下载链接 一.前言 网页包含以下内容: 页面基本信息:设置页面的字符集、兼容性、视口等元数据。 网站标题和描述:定义了网站的标题为"Benten",同时也设置了关键词和描述。 CSS样式表链接&a…

「GO基础」在Windows上配置VS Code GO语言开发环境

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Github copilot我用正版登录授权的,来体验一下吧

Github copilot 市面上的那种可以说是破解的,不是代码补全不稳定,就是chat不稳定,反正就是不怎样! 下面是官网正版开通的,欢迎体验15天 体验地址:https://www.bilibili.com/read/cv33696436 这种copilo…

Leetcode-48-旋转图像

题目说明 给定一个 n n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(多主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大…

剑指Offer题目笔记32(拓扑排序)

面试题113: 解决方案: 将课程看成图中的节点,如果两门课程存在先修顺序那么它们在图中对应的节点之间存在一条从先修课程到后修课程的边,因此这是一个有向图。可行的修课序列实际上是图的拓扑排序序列。图中的每条边都是从先修课…