首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[设计模式]之五:职责链模式

[设计模式]之五:职责链模式

作者头像
wOw
发布2018-09-18 15:33:40
4560
发布2018-09-18 15:33:40
举报

定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

场景

需要层层审批的,直到某一层可以给出具体结果。 比如离职申请,首先发给团队主管,然后团队主管发给部门经理,之后再给总经理这样,一层一层上传,直到信息传给能够给出反馈的人。

UML

示例代码

//统一处理接口
abstract class Handler {
	protected Handler handler;
	
	public void setHandler(Handler handler) {
		this.handler =  handler;
	}
	
	public abstract void HandlerRequest(int req);
}
//具体实现 处理不同的内容
public class ConcreteHandler1 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 0 && req < 10) {
			System.out.println("Handler1 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
public class ConcreteHandler2 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 10 && req < 20) {
			System.out.println("Handler2 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
public class ConcreteHandler3 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 20 && req < 30) {
			System.out.println("Handler3 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
//客户代码
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Handler h1 = new ConcreteHandler1();
		Handler h2 = new ConcreteHandler2();
		Handler h3 = new ConcreteHandler3();
		
		h1.setHandler(h2);
		h2.setHandler(h3);
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(2);
		list.add(5);
		list.add(14);
		list.add(22);
		list.add(18);
		list.add(3);
		list.add(27);
		list.add(20);
		
		for(Integer i : list) {
			h1.HandlerRequest(i);
		}
	}
//输出
Handler1 handle 2 now
Handler1 handle 5 now
Handler2 handle 14 now
Handler3 handle 22 now
Handler2 handle 18 now
Handler1 handle 3 now
Handler3 handle 27 now
Handler3 handle 20 now

评价

一个很好的优点是,当客户提交一个请求时,请求是按着链传递,直至有一个ConcreteHandler对象负责处理。也就是请求一定会被处理。

另外降低了耦合度。因为这个结构,接收者和发送者都不清楚对方的明确信息,且链中对象也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。

最后,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • 场景
  • UML
  • 示例代码
  • 评价
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档