Java设计模式中行为型模式是什么/模板方式又是什么,编程怎么运用

news2024/11/18 16:23:25

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

6.行为型模式

6.1 概述

6.1.1 特点

  • 用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎么相互协作共同完成单个对象都无法单独完成任务
  • 涉及算法与对象间职责的分配

6.1.2 分类

6.1.2.1 类行为模式

  • 采用继承机制在类间分派行为
  • 包含:模板方法模式、解释器模式

6.1.2.2 对象行为模式

  • 采用组合或聚合在对象间分派行为
  • 具有更大灵活性
  • 包含:策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式

6.2 模板方法模式

6.2.1 定义

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤

6.2.2 结构

  • 抽象类:负责给出一个算法的轮廓和骨架,由一个模板方法和若干个基本方法构成
  • 模板方法:实现算法的各个步骤方法,是模板方法组成部分,分为
    • 抽象方法:由抽象类声明,由其具体子类实现
    • 具体方法:由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
    • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法。一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXXX,返回值类型为Boolean型
  • 具体子类:实现抽象类中所定义的抽象方法和钩子方法,是一个顶级逻辑的组成步骤

6.2.3 案例(炒菜)

  • 抽象类
public abstract class AbstractMethod {  
    //    模板方法定义  
    public final void cookProcess() {  
        pourSoil();  
        heatSoil();  
        pourVegetable();  
        pourSauce();  
        fry();  
    }  
    private void pourSoil() {  
        System.out.println("倒油");  
    }  
    //    热油,步骤一样,直接实现  
    private void heatSoil() {  
        System.out.println("热油");  
    }  
    //    倒菜,不一样,倒菜心,倒包菜  
    public abstract void pourVegetable();  
    //    倒配料,也不一样  
    public abstract void pourSauce();  
    //    翻炒一样  
    private void fry() {  
        System.out.println("翻炒---直到熟透");  
    }  
}
  • 具体方法-炒菜心
public class ConcreteMethod extends AbstractMethod{  
    @Override  
    public void pourVegetable() {  
        System.out.println("倒菜心");  
    }  
    @Override  
    public void pourSauce() {  
        System.out.println("倒配料蒜蓉");  
    }  
}
  • 测试
public static void main(String[] args) {  
    ConcreteMethod caixin = new ConcreteMethod();  
    caixin.cookProcess();  
}
  • 结果
    ![[Pasted image 20230105224135.png]]

6.2.4 优缺点

6.2.4.1 优点

  • 提高代码复用性:将相同部分代码放在抽象父类汇总,将不同代码放入不同子类中
  • 实现了反向控制:通过父类调用其子类操作,通过对之类具体实现扩展不同行为,实现反向控制,符合“开闭原则"

6.2.4.2 缺点

  • 对每个不同的实现需要定义子类,这会导致类的个数增加,系统更加庞大,设计更加抽象
  • 父类中抽象方法由子类实现,子类执行结果会影响父类结果,导致一种反向的控制结构,提高了代码阅读的难度

6.2.5 使用场景

  • 算法的整体步骤固定,但其中个别部分易变,此时可使用模板方法模式,将容易易变的部分抽象出来,供子类实现
  • 需要通过子类来决定父类算法中某步骤是否执行,实现子类对父类的反向控制

6.2.6 JDK源码

InputStream类使用了模板方法弄死,在InputStream类中定义了多个read()方法,如下:

public abstract class InputStream implements Closeable {
	//无参抽象构造方法,子类必须重写
	public abstract int read() throws IOException;
	
	public int read(byte b[]) throws IOException {  
    return read(b, 0, b.length);  
	}
	
	public int read(byte b[], int off, int len) throws IOException {  
    if (b == null) {  
        throw new NullPointerException();  
    } else if (off < 0 || len < 0 || len > b.length - off) {  
        throw new IndexOutOfBoundsException();  
    } else if (len == 0) {  
        return 0;  
    }  
    
  //调用无参构造方法read(),每次读取一个字节数据
    int c = read();  
    if (c == -1) {  
        return -1;  
    }  
    b[off] = (byte)c;  
  
    int i = 1;  
    try {  
        for (; i < len ; i++) {  
            c = read();  
            if (c == -1) {  
                break;  
            }  
            b[off + i] = (byte)c;  
        }  
    } catch (IOException ee) {  
    }  
    return i;  
	}
}

分析:
无参方法read()是抽象方法,要求子类必须实现,read(byte b[])方法调用read(byte b[],int off,int len)方法,重点是此方法

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

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

相关文章

分布式基础篇3——前端开发基础知识(谷粒商城)

前端技术对比一、ES61、简介2、什么是 JavaScript3、ES6新特性3.1 let3.2 const3.3 解构表达式3.4 字符串扩展3.5 函数优化3.6 对象优化3.7 map 和 reduce3.8 Promise3.9 模块化二、Vue1、MVVM 思想2、Vue 简介3、Vue 入门案例4、Vue 指令插值表达式v-text、v-htmlv-bindv-mode…

【CANN训练营第三季】基于昇腾PyTorch框架的模型训练调优

文章目录性能分析工具PyTorch Profiling性能分析工具CANN Profiling结业考核1、使用Pytorch实现LeNet网络的minist手写数字识别。2、采用课程中学习到的手工或者自动迁移方式&#xff0c;将上述脚本迁移到昇腾npu上&#xff0c;单机单卡&#xff0c;提供迁移脚本&#xff0c;突…

YOLOv5视觉AI库安装

打开YOLOv5开源仓库: https://github.com/ultralytics/yolov5/blob/master/README.zh-CN.md下载源码:安装 : pip install -r requirements.txt完成安装目标检测推理可通过PyTorch Hub加载YOLOv5检测模型检测图像并返回数据帧使用YOLOv5要先安装opencv-python和pandas库安装open…

C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序

1 模糊集理论模糊集理论,也称为模糊集合论,或简单地称为模糊集,1965年美国学者扎德在数学上创立了一种描述模糊现象的方法—模糊集合论。这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合&#xff0c;建立适当的隶属函数&#xff0c;通过模糊集合的有关运算和变换&…

arduino - pinMode参数1的确定 - 以arduino nano every核心板为例

文章目录arduino - pinMode参数1的确定 - 以arduino nano every核心板为例概述笔记pins_arduino.hABX00028-datasheet.pdf简单的辨认管脚号就照ABX00028-datasheet.pdf来ENDarduino - pinMode参数1的确定 - 以arduino nano every核心板为例 概述 arduino nano every的核心板使…

我的交易抽象思路分享

这几天我老是抛出一些问题给老师们&#xff0c;都是故意而为之&#xff0c;因为我靠这种方式自己引导自己很多年&#xff1b; 比如&#xff1a;龙头真的存在么&#xff1f;为何前几天它还不是龙头&#xff0c;怎么今天就是了&#xff1f; 再如&#xff1a;交易模式和交易系统…

微信小程序解密encryptedData报错pad block corrupted

前要&#xff1a; 今天调试一下微信授权登录的时候老是第一次报错解密失败pad block corrupted&#xff0c;第二次授权的时候正常&#xff0c;因为第一次已经获取到手机号码&#xff01; 后端代码&#xff1a; public static JSONObject getUserInfo(String encryptedData, S…

微信自动回复软件

软件介绍 软件名称&#xff1a; 微信超级管家 适用平台&#xff1a; windows 是否免费&#xff1a; 完全免费 病毒检测&#xff1a; 火绒安全检测通过 流氓检测&#xff1a; 无广告、无弹窗、无其他流氓行为 软件大小&#xff1a; 183M 这个软件依赖的是本地微信客户端&#x…

C++ 初始化列表详解

目录 1.什么是初始化列表 2.什么时候需要使用初始化列表&#xff1f; 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_dada(value){}private:int m_dada; }; 如上图&#xff0c;红色圈起来的部分&#xff0c;就是构造函…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《5》

在上一篇文章的介绍中&#xff0c;我们知道语义分割可以对图像中的每个像素进行类别预测。这节主要讲关于全卷积网络(Fully Convolutional Network,FCN)&#xff0c;实现从图像像素到像素类别的变换。 那这里的卷积神经网络跟以往的有什么不一样的地方吗? 这里的网络是通过转置…

Java中享元模式是什么/享元模式有什么用,编程如何实现,哪里用到了享元模式

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.8 享元模式 5.8.1 概述 运用共享技术来有效地支持大量细粒度对象的复用&#xff0c;通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象…

图文并茂strapi 4.5.5自定义搭建指南以及数据库字段名接口返回mapping分析

strapi是什么&#xff1f; 基于Nodejs的开源免费CMS框架 为什么选择它&#xff1f; 基于nodejs,100&#xff05;JavaScript&#xff0c;上手迅速可轻松创建功能强大且可自定义的API可以使用任何喜欢的数据库 先决条件 首先你的电脑需要具备以下环境&#xff0c;再执行命令…

技术破局:程序员2023为何跳出舒适圈?

1前言今天的冬日暖阳高照&#xff0c;给我羽绒服下的肉身火一般的燥热&#xff0c;给了我一个错觉&#xff0c;以为到了阳春三月。刚刚送完老妈还有老婆孩子回老家&#xff0c;我坐到电脑机器前&#xff0c;准备捋一下思绪&#xff0c;回首2022的生活和工作。 2 2022 回顾今年用…

Linux下C/C++实现cpustat(测量CPU利用率)

在Linux中&#xff0c;cpustat定期转储正在运行的进程的当前CPU利用率统计信息。cpustat已被优化为具有最小的CPU开销&#xff0c;与top相比&#xff0c;通常使用约35%的CPU。cpustat还包括一些简单的统计分析选项&#xff0c;可以帮助描述CPU的加载方式。 cpustat介绍 cpust…

大数据概论

大数据概论大数据概论概念特点(4V)Volume(大量)Velocity(高速)Variety(多样)Value(低价值密度)应用场景发展前景部门间业务流程分析部门组织结构大数据概论 概念 大数据(BigData)&#xff0c;指无法在一定时间范围内\textcolor{Red}{无法在一定时间范围内}无法在一定时间范围…

iOS—Effective Objective—C2.0(2)

文章目录对象&#xff0c;消息&#xff0c;运行期理解“属性”概念合成与存取dynamic关键字属性特性原子性读/写权限内存管理语义方法名为什么几乎所有的属性都可以使用nonatomic&#xff1a;要点在对象的内部尽量直接访问实例变量惰性初始化&#xff1a;要点理解“对象同等性”…

2022年度总结——平凡之路

文章目录一、缘起二、回首2022三、展望2023四、结束语我是平凡的人&#xff0c;总要接受普通平凡的自己。一、缘起 我注册CSDN的时间是2021-07-25&#xff0c;这是一个值得纪念的时间。不过那时候的我并没有写博客&#xff0c;只是在CSDN游览一些文章&#xff0c;查看资料&…

一文读懂Java垃圾回收机制及算法原理万字详解

Java垃圾回收机制及算法 文章目录Java垃圾回收机制及算法垃圾回收概述垃圾回收-对象是否已死判断对象是否存活 - 引用计数算法判断对象是否存活-可达性分析算法可达性分析算法JVM之判断对象是否存活再谈引用垃圾收集算法分代收集理论标记-清除算法什么是标记-清除算法?标记-复…

读书:《卡片笔记写作法》

2023年罗胖跨年演讲时提到了一个故事&#xff0c;说Flomo的创始人有3个原则&#xff1a;一不在软件内弹广告&#xff0c;二不做永久会员&#xff0c;三不融资。我就马上试用了一下这款Flomo软件&#xff0c;然后就发现了《卡片笔记写作法》这本书。 这本书的卡片写作法来自于一…

【Qt】QtCreator新建Application项目的6类应用程序的示例

【Qt】QtCreator新建Application项目的6类应用程序的示例1、背景2、Application分类1、背景 操作系统&#xff1a;windows10专业版。 Qt版本&#xff1a;qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 注意&#xff1a;安装了该exe可执行文件&#xff0c;就自动安装了qtcr…