• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【设计模式与体系结构】行为型模式-责任链模式

简介

责任链模式(Chain Of Responsibility Pattern)允许沿着处理者链进行发送,避免请求者与发送者耦合在一起,每个处理者在收到请求后选择处理或者传递给下一个处理者,让多个对象都有接收到请求的可能性,这些对象形成链式结构,并且沿着这条链路传递请求,直至有对象处理请求。值得注意的是,责任链模式并不创建责任链,责任链的创建是由系统的其他部分完成的。

责任链模式的角色

  • 抽象处理(Handler)者类:定义了一个处理请求的抽象方法,并持有一个指向下一个处理者的引用。
  • 具体处理(Concrete Handler)者类:实现了抽象处理者的处理方法。在处理方法中,它可以根据具体条件决定是否处理请求,如果不处理则将请求传递给下一个处理者。

责任链模式的优点

  1. 请求者与处理者的解耦:请求者并不能直接确定请求最终是由谁进行处理,仅需要将请求发送到责任链上即可;
  2. 可扩展性好:链式结构,增删很容易,想要更改顺序也方便;
  3. 符合开闭原则:需要增加新的处理者类时,只需创建新的具体处理者类,并添加到责任链中即可,而无需修改原有代码。

责任链模式的缺点

  1. 请求可能不被处理:请求在责任链上可能没有处理者可以对其进行处理;
  2. 性能问题:责任链如果过长,那么请求在链上的传递会带来一定的性能消耗;
  3. 调试难度较高:由于请求可能在多个处理者之间传递,调试难度会稍大,可能需要跟踪处理整条责任链的逻辑。

责任链模式的使用场景

  1. 审批流程
  2. 拦截器或过滤器
  3. 事件处理系统

正文

定义一个抽象处理者类 Handler.java

public abstract class Handler {
	protected Handler handler;
	
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

	public abstract void handleRequest(int request);
}

定义具体处理者类 ConcreteHandler1.java

public class ConcreteHandler1 extends Handler {

	@Override
	public void handleRequesr(int request) {
		if (request < 5) {
			System.out.println("ConcreteHandler1 处理了请求:" + request);
		} else {
			System.out.println("ConcreteHandler1 将请求传递给了 " + this.handler.getClass().getName());
			this.handler.handleRequest(request);
		}
	}

}

定义具体处理者类 ConcreteHandler2.java

public class ConcreteHandler2 extends Handler {

	@Override
	public void handleRequest(int request) {
		if (request < 10) {
			System.out.println("ConcreteHandler2 处理了请求:" + request);
		} else {
			System.out.println("ConcreteHandler2 将请求传递给了 " + this.handler.getClass().getName());
		}
	}

}

定义一个客户端

public class Client {
	public static void main(String[] args) {
		Handler concreteHandler1 = new ConcreteHandler1();
		Handler concreteHandler2 = new ConcreteHandler2();
		concreteHandler1.setNextHandler(concreteHandler2);
		concreteHandler1.handleRequest(3);
		concreteHandler1.handleRequest(8);
	}
}

运行效果截图如下:

posted on 2025-02-05 19:43  RomanLin  阅读(48)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3