行为型——职责链模式(Responsibility)day23

《深入掌握PostgreSQL数据库》 - 专栏介绍和目录 本专栏系统讲解PostgreSQL数据库的全栈知识,涵盖基础入门到高级实战。内容分为语言基础与进阶、核心原理、高可用架构、性能优化、运维管理、扩展开发等多个模块。从安装配置、数据类型选择到窗口函数、CTE等高级特性,再到索引优化、执行计划分析等性能调优技巧,全面解析PostgreSQL的核心功能。同时深入探讨MVCC机制、WAL日志、并发控制等底层原理,并分享高可用架构设计、备份恢复等运维实践。适合各层次开发者系统学习PostgreSQL,掌握这一强大开源数据库的关键技术。 阅读详情

职责链模式基本介绍

  1. 职责链模式( Chain of Responsibility Pattern),又叫责任链模式,为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。
  2. 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
  3. 这种类型的设计模式属于行为型模式

职责链模式类图

在这里插入图片描述
➢对原理类图的说明-即(职责链模式的角色及职责)

  1. Handler: 抽象的处理者,定义了一个处理请求的接口,同时含义另外Handler
  2. ConcreteHandlerA,B 是具体的处理者,处理它自己负责的请求,可以访问它的后继者(即 下一个处理者),如果可以处理当前请求,则处理,否则就将该请求交个后继者去处理,从而形成一个职责链
  3. Request ,含 义很多属性,表示一个请求

案例

  1. 应用实例要求
    学校OA系统的采购审批项目:需求是
    采购员采购教学器材
    1)如果金额小于等于5000,由教学主任审批 (0<=x<=5000)
    2)如果金额小于等于10000,由院长审批(5000<x<=10000)
    3)如果金额小于等于30000,由副校长审批(10000<x<=30000)
    4)如果金额超过30000以上,有校长审批( 30000<x)
    请设计程序完成采购审批项目

  2. 思路分析和图解(类图)
    在这里插入图片描述

package com.xhl.Responsibility;
//请求类
public class PuchaseRequest {

	private int type = 0;//请求类型
	private float price = 0.0f;//请求金额
	private int id = 0;
	
	public PuchaseRequest(int type, float price, int id) {
		super();
		this.type = type;
		this.price = price;
		this.id = id;
	}

	public int getType() {
		return type;
	}

	public float getPrice() {
		return price;
	}

	public int getId() {
		return id;
	}
	
}
package com.xhl.Responsibility;

public abstract class Approver {
	
	Approver approver ;//下一个处理者
	String name;
	
	public Approver(String name) {
		this.name = name;
	}
	
	public void setApprover(Approver approver) {
		this.approver = approver;
	}
	//处理审批请求的方法,得到一个请求,处理是子类完成,因此该方法做成抽象
	public abstract void processRequest(PuchaseRequest puchaseRequest);
}
package com.xhl.Responsibility;

public class DepartmentApprover extends Approver{

	public DepartmentApprover(String name) {
		super(name);
	}
	
	@Override
	public void processRequest(PuchaseRequest puchaseRequest) {
		if(puchaseRequest.getPrice()<=5000) {
			System.out.println("请求编号 id = "+puchaseRequest.getId()+" 被 "+this.name+" 处理");
		}else {
			approver.processRequest(puchaseRequest);
		}
	}

}

package com.xhl.Responsibility;

public class CollegeApprover extends Approver{

	public CollegeApprover(String name) {
		super(name);
	}
	
	@Override
	public void processRequest(PuchaseRequest puchaseRequest) {
		if(puchaseRequest.getPrice()>5000&&puchaseRequest.getPrice()<=10000) {
			System.out.println("请求编号 id = "+puchaseRequest.getId()+" 被 "+this.name+" 处理");
		}else {
			approver.processRequest(puchaseRequest);
		}
	}

}
package com.xhl.Responsibility;

public class ViceSchoolMasterApprover extends Approver{

	public ViceSchoolMasterApprover(String name) {
		super(name);
	}
	
	@Override
	public void processRequest(PuchaseRequest puchaseRequest) {
		if(puchaseRequest.getPrice()>10000&&puchaseRequest.getPrice()<30000) {
			System.out.println("请求编号 id = "+puchaseRequest.getId()+" 被 "+this.name+" 处理");
		}else {
			approver.processRequest(puchaseRequest);
		}
	}

}
package com.xhl.Responsibility;

public class SchoolMasterApprover extends Approver{

	public SchoolMasterApprover(String name) {
		super(name);
	}
	
	@Override
	public void processRequest(PuchaseRequest puchaseRequest) {
		if(puchaseRequest.getPrice()>30000) {
			System.out.println("请求编号 id = "+puchaseRequest.getId()+" 被 "+this.name+" 处理");
		}else {
			approver.processRequest(puchaseRequest);
		}
	}

}
package com.xhl.Responsibility;

public class ResponsibilityDemo {
	public static void main(String[] args) {
		PuchaseRequest pRequest = new PuchaseRequest(1, 20000, 1);
		
		DepartmentApprover d = new DepartmentApprover("张主任");
		CollegeApprover c = new CollegeApprover("李院长");
		ViceSchoolMasterApprover v = new ViceSchoolMasterApprover("王副校长");
		SchoolMasterApprover s = new SchoolMasterApprover("赵校长");
		
		d.setApprover(c);
		c.setApprover(v);
		v.setApprover(s);
		
		d.processRequest(pRequest);
		v.processRequest(pRequest);
	}
}

在这里插入图片描述

总结

  1. 将请求和处理分开,实现解耦,提高系统的灵活性
  2. 简化了对象,使对象不需要知道链的结构
  3. 性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量,一般通过在Handler中设置一个最大节点数量,在setNext0方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能
  4. 调试不方便。 采用了类似递归的方式,调试时逻辑可能比较复杂
    5 )最佳应用场景:有多个对象可以处理同一个请求时,比如:多级请求、请假/加薪等审批流程、JavaWeb中Tomcat对Encoding的处理、拦截器
ADS基础教程24 - Gerber文件的导入 一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END! 阅读详情

相关推荐

LabVIEW小白福音:手把手教你用NI采集卡搭建振动信号采集系统(附源码和避坑指南)

本文为LabVIEW初学者提供详细的NI采集卡振动信号采集系统搭建指南,涵盖硬件连接、驱动安装、信号处理及性能优化等关键步骤。特别针对振动信号采集系统中的常见问题提供解决方案,并附源码和避坑指南,帮助用户快速上手并避免常见错误。

weixin_30485379的博客 103

设计模式之职责链模式(Chain Of Responsibility)

原文链接: http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/29/2662077.html 一、初识职责链模式 一个人在公司工作时间久了,难免遇到一点自己的私事,有私事就可能耽误上班的时间,可能就要请假,那么和谁去请假呢?可能是每个公司都有自己的请假制度。我们不妨假设:请假半天只要和部门主管说一声就行了,请假在半天到

Aiphis的博客 626

Hadoop与Kafka集群部署与优化实践指南

分布式系统是现代大数据处理的核心架构,其中Hadoop作为分布式存储与计算框架,Kafka作为分布式消息队列系统,共同构成了实时数据处理的基础设施。通过HDFS实现海量数据存储,结合YARN进行资源调度,而Kafka则保障了数据流的实时传输与高吞吐。这种技术组合在电商用户行为分析、物联网数据采集等场景中表现卓越。部署过程中需关注硬件资源配置、关键参数调优以及集群监控方案,例如通过调整HDFS块大小和Kafka partition数量来优化性能。合理运用Flume、Spark Streaming等工具可实现系

weixin_29061997的博客 360

23个设计模式一文搞懂

本笔记涵盖 23 种经典设计模式,按创建型、结构型、行为型三大类整理。每个模式配有生活类比、核心思想、结构图解、实现要点、真实应用案例、适用场景、优缺点分析及常见面试题。

weixin_72753562的博客 802

Ansys Lumerical实战:5步搞定Mach-Zehnder调制器多物理场仿真(附眼图分析技巧)

本文详细介绍了使用Ansys Lumerical进行行波马赫-曾德尔调制器多物理场仿真的完整流程。通过CHARGE、MODE和INTERCONNECT三大模块的协同工作,从电学参数提取、光学射频特性分析到系统级眼图评估,分步解析了高效仿真与性能优化的核心技巧,为硅光调制器设计提供了实战指南。

weixin_29056781的博客 542

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3677

创建型——工厂系列(Factory)day04

任何可以产生对象的方法或类,都可以称为工厂 单例也是一种工厂 为什么有了new以后,还要有工厂? 1、灵活控制生产过程 2、权限、修饰、日志…… 接口模式 package cn.xhl.interfacemodel; public interface IFruit { public void plant(); public void harvest(); public void grow(); } package cn.xhl.interfacemodel; public class ..

zero_ko的博客 2502

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 222

创建型——建造者(Builder)day06

分离复杂对象的构建和表示 同样的构建过程可以创建不同的表示 建造者模式和模板方法模式非常像 建造者模式强调构造对象 模板方法模式强调方法执行 基本介绍 1、建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 2、建造者模式是一步一步创建一个复 杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。 建造者的四个角色 1、.

zero_ko的博客 2420

扫地机器人设计与实现——基于嵌入式系统的智能家居解决方案

本文介绍了基于嵌入式技术的扫地机器人设计与实现。通过利用STM32单片机、传感器、驱动系统等硬件组件,并结合路径规划与控制算法、远程控制等软件技术,设计出了一款具有智能避障、路径规划、自动充电等功能的扫地机器人。系统的开发不仅提高了清洁效率,也为进一步研究和优化扫地机器人提供了实践基础。

2201_76125393的博客 1639

Win11此电脑怎么放在桌面上?Win11此电脑如何显示在电脑桌面上?

相信用习惯Win10的用户都喜欢电脑电脑桌面上的此电脑,但是很多用户更新完Win11正式版以后,发现桌面只有回收站和Microsoft Edge图标,没有此电脑。那么,Win11此电脑要如何显示呢?下面小编为大家简单介绍一下操作方法!5、桌面图标设置窗口,点击勾选计算机,然后点击确定,桌面就可以显示此电脑图标了。1、桌面空白处,点击右键,在打开的菜单项中,选择显示设置;4、个性化 - 主题,相关设置下,点击桌面图标设置;3、右侧点击主题(安装、创建、管理);2、设置窗口,左侧点击个性化;

shengyin714959的博客 13万+

结构型——外观模式(Facade)&&行为型——中介者模式(Mediator)day11

结构型——外观模式(Facade) 外观模式基本介绍 外观模式(Facade),外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 一个简单的例子理解:去一些政府部门办事,会跑很多不同的部门,可能去了部门A,部门A又让你去部门B……这样就很麻烦 如果使用门面模式,用户只需要访问门面,由门面模式去协调内部的关系。 外观模式

zero_ko的博客 442

图片风格自动分析模型

对于分类任务,我们可以使用交叉熵损失作为损失函数。同时,我们可以选择随机梯度下降(SGD)或Adam等优化器进行模型优化。# 使用SGD优化器# 或使用Adam优化器在这部分,总结整个项目的过程,包括数据准备、模型构建、训练、优化和评估等。同时,讨论可能的改进方向和未来工作,例如尝试更多的模型结构、优化技巧等。

a871923942的博客 1698

行为型——命令模式(Command) day15

目录命令模式基本介绍命令模式的原理类图实例——智能生活项目需求命令模式的总结 命令模式基本介绍 命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同

zero_ko的博客 330

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设计模式七大原则day01

设计模式七大原则 单一职责原则: 单一职责原则(Single Responsibility Principle, SRP)的定义是:指一个类或者模块应该有且只有一个改变的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。 含义:对于一个类,只有一个引起该类变化的原因;该类的职责是

zero_ko的博客 317

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

行为型——模板方法模式(Template)day14

模板方法模式基本介绍 模板方法模式 (Template Method Pattern),又叫模板模式(Template Pattern), 指 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说, 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤 这种类型的设计模式属于行为型模式。 模板方法模式原理类图 ➢对原理类图的说明-即(模板方法模式的角色及职责)

zero_ko的博客 313

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

结构型——适配器模式(Adapter)day07

基本介绍 适配器模式(Adapter Pattemn)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。 其别名为包装器(Wrapper) 适配器模式属于结构型模式 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式 工作原理 适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 从用户的角度看不到被适配者,是解耦的 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法 用户收到反馈结果

zero_ko的博客 272

结构型——桥接模式(Bridge)day08

桥接模式基本介绍 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。 是一种结构型设计模式 Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展 桥接模式原理图 说明: Client类:桥接模式的调用者 抽象类(Abstraction) :维护了Implementor/

zero_ko的博客 270

行为型——策略模式(Strategy)day22

策略模式基本介绍 策略模式(Strategy Patterm) 中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口) ;第三、多用组合/聚合,少用继承(客户通过组合方式使用策略) . 策略模式的原理类图 说明:从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定

zero_ko的博客 248

行为型——备忘录模式(Memento)day19

文章目录备忘录模式基本介绍备忘录模式的原理类图代码实现备忘录模式总结 备忘录模式基本介绍 备忘录模式(Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对 象的某;种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原

zero_ko的博客 226

UML六种关系day02

UML图 UML图分类: 用例图 静态结构图:类图、对象图、包图、组件图、部署图 动态行为图:交互图(时序图和协作图)、状态图、活动图 UML类图 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。 类之间的关系:依赖、关联、继承(泛化)、实现、组合、聚合。 依赖关系(Dependence) 只要是在类中用到了对方,那么他们之间就存在依赖关系。 public class PersonServiceBean{ private PersonDao personDao;//类 publi

zero_ko的博客 222

结构型——组合模式(Composite)day10

组合模式针对树形结构的模式例如 传统方案实现 将学院看做是学校的子类, 系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是:在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系,因此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等 解决方案: 把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。=> 组合模式 组合模式基本介绍 组合模式(Composite Patterm),又叫部分

zero_ko的博客 221

行为型——解释器模式(Interpreter)day20

文章目录解释器模式基本介绍解释器模式的类图解释器模式来实现四则总结 解释器模式基本介绍 基本介绍 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器 解释器模式( Interpreter Pattern) :是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式) 应用场景 -应用可以将一个需要解释执行的语言中的句子表示为一

zero_ko的博客 219

行为型——状态模式(State)day21

状态模式简介 基本介绍 1)状态模式(StatePattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 2)当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类 状态模式的原理类图 ➢对原理类图的说明-即(状态模式的角色及职责) Context 类为环境角色,用于维护State实例,这个实例定义当前状态 State 是抽象状态角色,定义一个接口封装与Context的一个特点接口相关行为 ConcreteStat

zero_ko的博客 216

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 275

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 232
上一篇: 行为型——策略模式(Strategy)day22
下一篇: 207. 课程表
哆唻咪à
博客等级 码龄9年 0粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值