【设计模式-4.4】行为型——模板方法模式

说明:本文介绍设计模式中行为型设计模式中的,模板方法模式;

生存

模版方法模式是行为型设计模式,关注于对象的行为。在《秒懂设计模式》(刘韬 著)中举了一个例子,例如哺乳动物的生存技能,鲸鱼、人类都属于哺乳动物,有吃、动的行为,并依靠这两项行为生存。代码如下:

(Whale,鲸鱼)

/*** 鲸鱼类*/
public class Whale {/*** 鲸鱼的活动*/public void move(){System.out.println("鲸鱼在游泳");}/*** 鲸鱼的吃*/public void eat() {System.out.println("鲸鱼捕食海洋中的小鱼");}/*** 鲸鱼的生存*/public void life() {move();eat();}
}

(Human,人类)

/*** 人类*/
public class Human {/*** 人类的活动*/public void move(){System.out.println("人类在走路");}/*** 人类的吃*/public void eat() {System.out.println("人类吃饭");}/*** 人类的生存*/public void life() {move();eat();}
}

(Client,客户端,模拟流程)

/*** 客户端*/
public class Client {public static void main(String[] args) {new Whale().life();System.out.println("===========");new Human().life();}
}

(执行程序)

在这里插入图片描述

模板方式模式

分析上面的代码,可以看到,鲸鱼、人类生存行为都是依赖于吃、动行为的,是模板化的。所以,可以考虑抽取出一个哺乳动物抽象类,类中有吃、动抽象方法,而对于生存行为,则将其模板化,固定搭配,写在一个final修饰的生存方法中。如下:

(Mammal,哺乳动物抽象类,固定生存模板方法)

/*** 哺乳动物类*/
public abstract class Mammal {/*** 哺乳动物的活动*/public abstract void move();/*** 哺乳动物的吃*/public abstract void eat();/*** 哺乳动物的生存*/public final void life() {move();eat();}
}

(Whale,鲸鱼,具体实现类)

/*** 鲸鱼类*/
public class Whale extends Mammal{/*** 鲸鱼的活动*/public void move(){System.out.println("鲸鱼在游泳");}/*** 鲸鱼的吃*/public void eat() {System.out.println("鲸鱼捕食海洋中的小鱼");}
}

(Human,人类,具体实现类)

/*** 人类*/
public class Human extends Mammal{/*** 人类的活动*/public void move(){System.out.println("人类在走路");}/*** 人类的吃*/public void eat() {System.out.println("人类吃饭");}
}

(Client,客户端,模拟流程)

/*** 客户端*/
public class Client {public static void main(String[] args) {new Whale().life();System.out.println("===========");new Human().life();}
}

在这里插入图片描述

通过模板方法模式,将多个对象中行为的固定组合,从对象中抽取出来放到父类中,简化了代码,同时也统一了子类的方法。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书,案例代码与书中的略有不同。

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

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

相关文章

MacOS 14.1 配置kerberos认证

MacOS 14.1 配置kerberos认证 MacOS 14.1 配置kerberos认证krb5.conf票据显示程序问题参考地址 MacOS 14.1 配置kerberos认证 原操作系统为 10.14.*,因安装别的软件失败,不想去找旧版本了,所以把OS直接升级到最新版的14.1啦,升级…

DevEco Studio IDE 创建项目时候配置环境

DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…

手写线程池

文章目录 线程池最主要有两部分,阻塞队列和线程池,阻塞队列使用双端队列,我们需要定义队列的容量、 还需要锁来保证将任务放入队列和取出队列的正确性、使用Reentrentlock定义两个条件变量:生产者条件变量和消费者条件变量&#x…

系列学习前端之第 3 章:一文精通 css

全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料: 链接: 百度网盘 请输入提取码 提取码: 6666 一、CSS基础 1. CSS简介 CSS 的全称为:层叠样式表 ( Cascading Style Sheets ) 。 CSS 也是一种标记语言,用于给 HTML 结构设…

【微软技术栈】发布自己造的轮子 -- 创建Nuget包(分布操作)

目录 1、您的项目 2、创建 .nuspec 文件 3、一张图片胜过一千个拉取请求 4、包括自述文件 MD 文件 5、构建软件包 6、将包部署到 Nuget.Org 7、手动上传软件包 8、自动化和脚本化部署 9、我们如何构建和部署 ErrLog.IO Nuget 包 10、Nuget统计数据 11、最后的思考 创建 Nuget 包…

关于ASJ 系列剩余电流动作继电器的详细介绍-安科瑞 蒋静

1 概述 ASJ 系列剩余电流动作继电器可与低压断路器或低压接触器等组成组合式剩余电流保护装置,主要适用 于交流 50Hz ,额定电压 400V 及以下的 TT 和 TN 系统配电线路,用来对电气线路进行接地故障保护,防止 接地故障电…

安全访问服务边缘(SASE):解决第三方风险的全方位解决方案

随着数字化时代的到来,企业和组织对于网络安全的需求越来越迫切。传统的安全解决方案已经无法满足复杂多变的网络环境,因此新兴的安全访问服务边缘(SASE)应运而生。本文将介绍SASE的概念和工作原理,并重点阐述它作为第…

深入学习Redis:从入门到实战

Redis快速入门 1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端1.4.1.R…

awt中文乱码-Intellij IDEA

乱码的根本原因在于秦始皇嘎太早了(bushi 解决方法:肉眼可见的编码设置统一为GBK 1.打开设置找到文件编码 2.肉眼可见的编码统统改成GBK 有人该问了,为什么不改成utf-8,因为awt的编码由操作系统决定,我的是win家庭中…

队列的模拟实现

队列的模拟实现 文章目录 队列的模拟实现前言一、队列的基本原理1)队列的定义2)队列的特性3)队列的应用场景 二、模拟实现STL中队列的功能1)设计数据结构2)初始化队列(QueueInit)3)入…

MySQL 中Relay Log打满磁盘问题的排查方案

MySQL 中Relay Log打满磁盘问题的排查方案 引言: MySQL Relay Log(中继日志)是MySQL复制过程中的一个重要组件,它用于将主数据库的二进制日志事件传递给从数据库。然而,当中继日志不断增长并最终占满磁盘空间时&…

Flutter:web项目跨域问题解决

前后端解决系列 文章目录 一、Flutter web客户端解决本地环境调试跨域问题二、Flutter web客户端解决线上环境跨域问题 一、Flutter web客户端解决本地环境调试跨域问题 就一句命令【--web-browser-flag "--disable-web-security"】,用来屏蔽浏览器域名请…