【设计模式】第15节:行为型模式之“职责链模式”

news/2024/5/19 13:26:39 标签: 设计模式, 责任链模式

一、简介

职责链模式:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

二、优点

  • 分离发送者和接受者
  • 易于扩展和维护

三、应用场景

  • 有多个对象可以处理请求
  • 动态添加、修改或删除请求处理器

四、UML类图

请添加图片描述

请添加图片描述

五、案例

日志打印,根据日志的不同等级,打印不同内容的日志。

package main

import "fmt"

const (
	ERROR   = 0
	WARNING = 1
	INFO    = 2
)

type Logger interface {
	CanHandleMassage(logLever int) bool
	Handle(logLevel int, message string)
}

type HandleChain struct {
	Logger          Logger
	NextHandleChain *HandleChain
}

func (hc *HandleChain) SetNextHandleChain(nextHandleChain *HandleChain) {
	hc.NextHandleChain = nextHandleChain
}

func (hc *HandleChain) Handle(logLevel int, message string) {
	if hc.Logger.CanHandleMassage(logLevel) {
		hc.Logger.Handle(logLevel, message)
	} else {
		hc.NextHandleChain.Handle(logLevel, message)
	}
}

type ErrorLogger struct {
	Level int
}

func NewErrorLogger() *HandleChain {
	return &HandleChain{Logger: &ErrorLogger{Level: ERROR}, NextHandleChain: &HandleChain{}}
}

func (el *ErrorLogger) CanHandleMassage(logLever int) bool {
	return el.Level == logLever
}

func (el *ErrorLogger) Handle(logLevel int, message string) {
	fmt.Printf("Error: %v\n", message)
}

type WarningLogger struct {
	Level int
}

func NewWarningLogger() *HandleChain {
	return &HandleChain{Logger: &WarningLogger{Level: WARNING}, NextHandleChain: &HandleChain{}}
}

func (wl *WarningLogger) CanHandleMassage(logLever int) bool {
	return wl.Level == logLever
}

func (wl *WarningLogger) Handle(logLevel int, message string) {
	fmt.Printf("Warning: %v\n", message)
}

type InfoLogger struct {
	Level int
}

func NewInfoLogger() *HandleChain {
	return &HandleChain{Logger: &InfoLogger{Level: INFO}, NextHandleChain: &HandleChain{}}
}

func (il *InfoLogger) CanHandleMassage(logLever int) bool {
	return il.Level == logLever
}

func (il *InfoLogger) Handle(logLevel int, message string) {
	fmt.Printf("Info: %v\n", message)
}

func main() {
	errorLogger := NewErrorLogger()
	warningLogger := NewWarningLogger()
	infoLogger := NewInfoLogger()

	errorLogger.SetNextHandleChain(warningLogger)
	warningLogger.SetNextHandleChain(infoLogger)

	errorLogger.Handle(ERROR, "This is an error message")
	errorLogger.Handle(WARNING, "This is a warning message")
	errorLogger.Handle(INFO, "This is an info message")
}

http://www.niftyadmin.cn/n/5134632.html

相关文章

二手的需求

案例1030 某天项目经理小王,从用户现场带回了需求,以图形的方式,交给了产品经理。告诉他就照这样设计,结果是项目经理放弃让产品经理出效果图。 原因是产品经理觉得项目经理带回来的需求有问题。项目经理解释产品经理不接受&…

用 Vue Router 的 hash 模式如何实现锚点?

① 首先,在 Vue Router 的路由配置中,需要将 mode 设置为 hash const router new VueRouter({mode: hash,routes: [] // 路由配置 }) ② 在页面跳转时,使用 router.push 方法进行路由跳转,设置目标 URL 的 hash 部分为锚点的名称…

15 结构型模式-外观模式

1 外观模式介绍 2 外观模式原理 public class SubSystemA {public void methodA(){//业务代码} }public class SubSystemB {public void methodB(){} }public class SubSystemC {public void methodC(){} }public class Facade {private SubSystemA obj1 new SubSystemA();pri…

【Spring】Spring MVC请求响应

文章目录 1. 请求1.1 传递单个参数1.2 传递多个参数1.3 传递对象1.4 后端参数重命名1.5 传递数组1.6 传递集合1.7 传递JSON对象1.8 获取URL中参数1.9 上传⽂件1.10 获得Cookie1.11 获得Session1.12 获得Header 2. 响应2.1 返回静态界面2.2 返回数据2.3 返回HTML代码片段2.4 返回…

C++标准模板(STL)- 类型支持 (复合类型类别,is_fundamental,is_fundamental)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

一个阅读英文文档的记录与思考:

背景&#xff1a;我在阅读文档的时候总会有一些疑惑&#xff0c; 关于这些是什么&#xff0c;这他妈怎么用800个生词解释一个生词&#xff0c;这都是什么狗屁东西等等 这个变量为什么没提到过&#xff0c;又尼玛有个新造的词组什么意思阿 等等 关于这些问题&#xff0c;他们直…

JAVA开发常见笔试题其一

选择题 1、下面Java赋值语句错误的是&#xff08; A &#xff09; A&#xff1a;float f 45.0; B&#xff1a; char s ‘\u0063’; C: Object o ‘f’; D: String s ”hello,world”; 2、关于Java中参数传递的说法&#xff0c;哪个是错误的(B) A.在方法中&#xff0c;修改一…

3DMAX快速瓦片屋顶铺设插件使用方法详解

3DMAX快速瓦片屋顶铺设插件教程 3DMAX快速瓦片屋顶铺设插件&#xff0c;一键生成瓦片屋顶、瓦脊的插件&#xff0c;是一款非常实用的古风建筑建模插件。 【适用版本】 3dMax7或更新版本 【使用方法】 提示&#xff1a;建议使用本插件进行工作时&#xff0c;将3dMax单位设置为…