设计模式之模板方法模式详解(上)

news2024/11/26 22:25:58
模板方法模式
1)概述
1.定义

定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.方案

背景:某个方法的实现需要多个步骤(类似“请客”),其中有些步骤是固定的(类似“点单”和“买单”),而有些步骤并不固定,存在可变性(类似“吃东西”)。

概念:在模板方法模式中,将实现功能的每一个步骤所对应的方法称为基本方法(例如“点单”、“吃东西”和“买单”),而调用这些基本方法同时定义基本方法的执行次序的方法称为模板方法(例如“请客”)。

实现:在模板方法模式中,将相同的代码放在父类中,例如将模板方法“请客”以及基本方法“点单”和“买单”的实现放在父类中,而对于基本方法“吃东西”,在父类中只做一个声明,将其具体实现放在不同的子类中,在一个子类中提供“吃面条”的实现,而另一个子类提供“吃满汉全席”的实现。

3.结构图

在这里插入图片描述

4.角色

AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

ConcreteClass(具体子类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

5.模式实现

在实现模板方法模式时,开发抽象类的软件设计师和开发具体子类的软件设计师可以协作,一个设计师负责给出算法的轮廓和框架,另一些设计师则负责给出这个算法的各个逻辑步骤。

实现具体逻辑步骤的方法即为基本方法,而将这些基本方法汇总起来的方法即为模板方法。

模板方法:模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。

基本方法:基本方法是实现算法各个步骤的方法,是模板方法的组成部分,可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

  • 抽象方法:抽象方法由抽象类声明、由其具体子类实现。
  • 具体方法:具体方法由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
  • 钩子方法:钩子方法由抽象类或具体类声明并实现,而其子类可能会加以扩展。

钩子方法有两类

第一类钩子方法:可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的,这类方法名一般为IsXXX(),用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行。

……
//模板方法
public void TemplateMethod() 
{
	Open();
	Display();
	//通过钩子方法来确定某步骤是否执行
	if (IsPrint()){
    Print();
	}
}
 
//钩子方法
public bool IsPrint()
{
    return true;
}
……

第二类钩子方法:实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法,与抽象方法相比,这类钩子方法的好处在于子类如果没有覆盖父类中定义的钩子方法,编译可以正常通过,但是如果没有覆盖父类中声明的抽象方法,编译将报错。

abstract class AbstractClass {
	//模板方法
	public void TemplateMethod() {
     PrimitiveOperation1();
     PrimitiveOperation2();
     PrimitiveOperation3();
	}
 
	//基本方法—具体方法
	public void PrimitiveOperation1() {
    //实现代码
	}
 
	//基本方法—抽象方法
  public abstract void PrimitiveOperation2();    
 
	//基本方法—钩子方法
	public virtual void PrimitiveOperation3(){}
}

注意:在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。

2)完整解决方案
1.结构图

在这里插入图片描述

Account充当抽象类角色,CurrentAccount和SavingAccount充当具体子类角色。

2.代码实现

Account:账户类,充当抽象类

abstract class Account {
    //基本方法——具体方法
    public boolean Validate(String account, String password) {
        System.out.println("账号:" + account);
        System.out.println("密码:" + password);

        //模拟登录
        return account.equals("张无忌") && password.equals("123456");
    }

    //基本方法——抽象方法
    public abstract void CalculateInterest();

    //基本方法——具体方法
    public void Display() {
        System.out.println("显示利息!");
    }

    //模板方法
    public void Handle(String account, String password) {
        if (!Validate(account, password)) {
            System.out.println("账户或密码错误!");
            return;
        }
        CalculateInterest();
        Display();
    }
}

CurrentAccount:活期账户类,充当具体子类

public class CurrentAccount extends Account {
    //覆盖父类的抽象基本方法
    @Override
    public void CalculateInterest() {
        System.out.println("按活期利率计算利息!");
    }
}

SavingAccount:定期账户类,充当具体子类

public class SavingAccount extends Account{
    @Override
    public void CalculateInterest() {
        System.out.println("按定期利率计算利息!");
    }
}

客户端类

public class Client {
    public static void main(String[] args) {
        Account account;
        account = new CurrentAccount();
        account.Handle("张无忌", "123456");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日,为推进采购阳光化、数字化和智能化,提升管理效率与质量,企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司(以下简称“健力宝”)成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化 目录 时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现TVF-EMD(时变滤波器的经验模态分解)可直接替换 Matlab语言 1.…

还原matlab编辑器窗口和主窗口分开的问题

问题 matlab不知道早点的,点击运行后会弹出新的窗口,咋整都恢复不了 解决方案 首先,在编辑器窗口下,按ctrlshiftD,此时编辑器窗口和主窗口就合并了,问题解决。

Databend Cloud 正式上线腾讯云市场,加速挖掘数据创新价值

近日,新一代大数据分析平台 Databend Cloud 正式上线腾讯云千帆云市场,成为腾讯云 SaaS 生态圈中的重要一员。依托腾讯云平台的技术支持和市场资源, Databend Cloud 将充分发挥数据价值的挖掘能力,助力更多企业实现数据驱动的决策…

基于docker的开发者集成环境

docker-compose一键部署开发者环境。 常见的中间件:nginx, mysql, redis, mongo, rabbitmq, nacos, rocketmq, zookeeper等。 GIthub项目地址 1. 下载项目:git clone https://github.com/xhga/docker-develop-env.git 2. 进入文件夹:cd d…

嵌入式硬件需要过哪几关?

目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 第一关:基础基础还是基础! 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 …

[笔试强训day01]

BC153 [NOIP2010]数字统计 描述 牛牛拿到了一个字符串。 他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。 但相同而不相邻、不相同的相邻字母都是不可以被消除的。 牛牛想把…

【Linux】应用层协议序列化和反序列化

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:C【智能指针】 前言 在正式代码开始前,会有一些前提知识引入 目录 👉🏻序列…

设计模式———单例模式

单例也就是只能有一个实例,即只创建一个实例对象,不能有多个。 可能会疑惑,那我写代码的时候注意点,只new一次不就得了。理论上是可以的,但在实际中很难实现,因为你无法预料到后面是否会脑抽一下~~因此我们…

北京InfoComm China 2024今日开幕:重新定义人机交互

2024年4月17日,北京——北京InfoComm China 2024展会在万众期待中于北京国家会议中心盛大开幕。这场为期三天的行业盛会,将持续至4月19日,为参观者们带来一场前所未有的创新技术与解决方案的盛宴。 本届展会作为亚太地区领先的专业视听与集成…

本地jar包手动添加到Maven仓库

步骤&#xff1a; 打开命令行窗口&#xff08;Windows&#xff09;或终端&#xff08;macOS/Linux&#xff09;。使用cd命令导航到包含jar文件的目录。执行以下命令&#xff0c;将jar文件添加到Maven本地仓库&#xff1a; mvn install:install-file -Dfile<jar文件名>.…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求&#xff0c;其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

57.网络游戏逆向分析与漏洞攻防-基础数据分析筛选-获取他人发来的聊天信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&…

从二本调剂到上海互联网公司算法工程师:我的成长故事

探讨选择成为一名程序员的原因&#xff0c;是出于兴趣还是职业发展&#xff1f; 在这个科技飞速发展的时代&#xff0c;程序员这一职业无疑成为了许多人眼中的香饽饽。那么&#xff0c;是什么驱使着越来越多的人选择投身于这一行业呢&#xff1f;是出于对编程的热爱&#xff0…

计算机网络基础:宏观认识

目录 一、网络发展背景与基本概念 二、网络协议的意义与TCP/IP五层结构模型 三、网络传输的基本流程与封装分用 四、ip地址和mac地址 随着信息技术的飞速发展&#xff0c;计算机网络已经成为了现代社会不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们几乎都离…

MySql中truncate,delete有什么区别?什么情况下id会不会连续呢?

TRUNCATE和DELETE都是用来删除表中数据的SQL命令&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; DELETE命令&#xff1a;DELETE命令用于从表中删除一行、多行或所有行。你可以添加WHERE子句来指定要删除的行。例如&#xff0c;DELETE FROM table_name WHERE cond…

Java项目实现Excel导出(Hutool)

官网&#xff1a; Excel生成-ExcelWriter (hutool.cn) 1.使用Hutool工具实现Excel导出&#xff08;.xlsx格式&#xff09; 业务场景&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 第零步&#xff1a;导入依赖 <!-…

[Win11·Copilot] Win11 系统更新重启后任务栏 Copilot 图标突然消失 | 解决方案

文章目录 前言Copilot介绍产生异常的原因解决方案总结 前言 在 Windows 11 的最新系统更新之后&#xff0c;一些用户报告了任务栏中 Copilot 图标消失的问题。这篇技术博文将为您提供详细的解决方案&#xff0c;帮助您恢复 Copilot 图标&#xff0c;并确保您能够继续享受 Copi…