Java设计模式-责任链(Chain of Responsibility)模式

介绍

Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中的哪个对象处理,所以责任链模式可以方便组织责任链而不影响调用方。

责任链模式一般定义抽象类或者接口来规范行为,而定义具体类实现具体的处理逻辑。

示例

示例1:Netty中的handler就构成了责任链模式

注:下面图拷贝自Netty的ChannelPipeline API中的图

示例2:一个简单的责任链模式代码示例

复制代码
package com.thb;

// 定义一个抽象类,规范行为
public abstract class AbstractHandler {
	
	private AbstractHandler nextHandler;  // 指向下一个处理器
	private char startWith;
	
	public AbstractHandler(char startWith) {
		this.startWith = startWith;
	}
	
	// 处理逻辑的抽象方法
	public abstract void handleMessage(String msg);	
	
	// 设置下一个处理器
	public void setNextHandler(AbstractHandler nextHandler) {
		this.nextHandler = nextHandler;
	}
	
	// 取出下一个处理器
	public AbstractHandler getNextHandler() {
		return this.nextHandler;
	}	
}


// 定义具体类,实现真正的处理逻辑
package com.thb;

public class Handler extends AbstractHandler {
	
	public Handler(char startWith) {
		super(startWith);
	}
	
	@Override
	public void handleMessage(String msg) {
		// 具体处理逻辑
		if (msg.startsWith("H")) {
			System.out.println("process the message");
		} else {
			if (getNextHandler() != null) {
				getNextHandler().handleMessage(msg);
			} else {
				System.out.println("no suitable hander");
			}
		}		
		
	}

}


// 定义一个客户端来模拟调用
package com.thb;

public class Test2 {
	
	public static void main(String[] args) {
		AbstractHandler handler1 = new Handler('a');
		AbstractHandler handler2 = new Handler('H');
		AbstractHandler handler3 = new Handler('c');
		handler1.setNextHandler(handler2);
		handler2.setNextHandler(handler3);
		
		String msg = "Hello"; 
		handler1.handleMessage(msg);
		
		msg = "world";
		handler1.handleMessage(msg);
	}

}

输出结果:

相关推荐
寻道码路2 小时前
LangChain4j Java AI 应用开发实战(四):提示词工程进阶 - 模板化与结构化 Prompt 设计
java·人工智能·ai·prompt·aigc
lcreek7 小时前
Java 反序列化漏洞深度解析(一):从URLDNS到真正的DNS探测
java·反序列化漏洞
杰克尼7 小时前
天机学堂复习总结(day03-day04)
java·开发语言·redis·elasticsearch·spring cloud
x***r1518 小时前
jdk-11.0.16.1_windows使用步骤详解(附JDK 11环境变量配置与验证教程)
java·开发语言·windows
弹简特8 小时前
【Java项目-轻聊】01-项目演示+项目介绍+准备工作+项目源码
java
luck_bor9 小时前
File类&递归作业
java·开发语言
武子康9 小时前
Java-07 深入浅出 MyBatis数据库一对多关系模型实战:表结构设计与查询实现
java·后端
REDcker11 小时前
Linux OverlayFS详解
java·linux·运维
Royzst11 小时前
xml知识点
java·服务器·前端
鱼鳞_12 小时前
苍穹外卖-Day08(缓存套餐)
java·redis·缓存