前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 设计模式系列(15) —— 责任链模式

Java 设计模式系列(15) —— 责任链模式

作者头像
求和小熊猫
发布2021-01-18 10:19:23
2720
发布2021-01-18 10:19:23
举报
文章被收录于专栏:∑小熊猫的博客

责任链模式

责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求发送者和请求接受者之间的耦合关系,将这些对象连城一条链,并沿着这条链传递请求,直到有对象处理它为止。

责任链模式涉及的角色:

  • Handler 抽象处理者:该角色对请求进行抽象,并定义一个方法以设定和返回对下一个处理者的引用
  • Concrete Handler 具体处理者:该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者
责任链模式的简单示例
在这里插入图片描述
在这里插入图片描述

抽象处理者

抽象处理者一般采用抽象类,抽象类中有指向下一个抽象处理者的指针,并且定义在何种情况下会将请求转交到下一处理者,并且定义了请求处理的接口

代码语言:javascript
复制
public abstract class Handler {
	private Handler nexthandler;
	
	public void setNextHandler(Handler handler) {
		this.nexthandler = handler;
	}
	
	public Response processRequest(Request req) {		
		Response res = null;
		if(req.getReqLevel() == this.getRequestLevel()) {
			res = new Response();
			res.setRescode(-1);
			res.setRes(this.handleRequest(req));
		}else {
			if (this.nexthandler != null) {
				res = this.nexthandler.processRequest(req);
			}else {
				System.out.println("常规处理");
				res = new Response();
				res.setRescode(-1);
				res.setRes("此请求未得到相应对象进行处理");
			}
		}		
		
		return res;
	}
	
	protected abstract int getRequestLevel();
	
	protected abstract String handleRequest(Request req);

}

具体处理者

具体处理者主要完成对请求的处理

  1. ConcreteHandler1
代码语言:javascript
复制
public class ConcreteHandller1 extends Handler {

	@Override
	protected int getRequestLevel() {
		return HandleLevel.Min.getLevel();
	}

	@Override
	protected String handleRequest(Request req) {
		System.out.println("第一节点开始处理");
		System.out.println(req.getVar());
		System.out.println("第一节点处理结束");
		return "res of " + req.toString();
		
	}

}

2 ConcreteHandler2

代码语言:javascript
复制
public class ConcreteHandller2 extends Handler {

	@Override
	protected int getRequestLevel() {
		return HandleLevel.Mid.getLevel();
	}

	@Override
	protected String handleRequest(Request req) {
		System.out.println("第二节点开始处理");
		System.out.println(req.getVar());
		System.out.println("第二节点处理结束");
		return "res of " + req.toString();
		
	}

}
  1. ConcreteHandler3
代码语言:javascript
复制
public class ConcreteHandller3 extends Handler {

	@Override
	protected int getRequestLevel() {
		return HandleLevel.Max.getLevel();
	}

	@Override
	protected String handleRequest(Request req) {
		System.out.println("第三节点开始处理");
		System.out.println(req.getVar());
		System.out.println("第三节点处理结束");
		return "res of " + req.toString();
		
	}

}

请求响应对象

  1. Request
代码语言:javascript
复制
public class Request {
	private int reqLevel;
	
	private String var;

	public int getReqLevel() {
		return reqLevel;
	}

	public void setReqLevel(int reqLevel) {
		this.reqLevel = reqLevel;
	}

	public String getVar() {
		return var;
	}

	public void setVar(String var) {
		this.var = var;
	}
	
}
  1. Response
代码语言:javascript
复制
public class Response {
	private int rescode;
	private String res;
	public int getRescode() {
		return rescode;
	}
	public void setRescode(int rescode) {
		this.rescode = rescode;
	}
	public String getRes() {
		return res;
	}
	public void setRes(String res) {
		this.res = res;
	}

}

处理等级枚举

代码语言:javascript
复制
public enum HandleLevel {
	Min(1),Mid(5),Max(9);
	private int level;
	HandleLevel(int level){
		this.level = level;
	}
	public int getLevel() {
		return level;
	}

}

客户端调用

在客户端的调用中,我们发现,具体处理对象连城了一条链。

代码语言:javascript
复制
public class Client {
	public static void main(String[] args) {
		Handler responseChain = new ConcreteHandller1();
		Handler node2 = new ConcreteHandller2();
		Handler node3 = new ConcreteHandller3();
		node2.setNextHandler(node3);
		responseChain.setNextHandler(node2);
		Request req = new Request();
		req.setReqLevel(HandleLevel.Max.getLevel());
		req.setVar("req1");
		
		Response res = responseChain.processRequest(req);
		System.out.println(res.getRes());
	}

}
责任链模式的优缺点和应用场景

责任链模式优点:

  • 将请求和处理分开,请求者不知道处理者是谁,处理者也不知道请求者的全貌
  • 提高了系统的灵活性

责任链模式的缺点:

  • 性能低下,任何一个请求都是从头到尾的执行
  • 调试不方便

责任链模式要尽量避免链中节点数量过多的情况,避免出现超长链的情况。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 责任链模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档