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

本文介绍了职责链模式如何在日志处理中工作,通过创建一个对象链,每个节点处理不同级别的日志,实现了发送者与接收者解耦。通过示例展示了如何使用UML类图和创建ErrorLogger,WarningLogger,InfoLogger来处理错误、警告和信息级别的日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

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

二、优点

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

三、应用场景

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

四、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")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值