责任链模式(Chain of Responsibility)----行为笔记

责任链模式(Chain of Responsibility----行为笔记

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

 

一、涉及对象

抽象处理者(Handler):定义一个处理请求的接口;(接口、抽象类)

具体处理者(ConcreteHandler)在接到请求后,可以选择将请求处理掉,或者将请求传给下家。持有对下家的引用。

Client提交请求。

 

二、何时适用

有多个处理者对象处理一个请求,哪个对象处理该请求运行时刻自动确定。

在不明确指定接收者的情况下,向多个对象中的一个提交一个请求,

处理一个请求的处理者对象集合需要动态指定时

 

注意:一个请求可能到了链的末端都得不到处理,或者因为没有正确配置,而得不到处理。

 

三、故事说明

CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

 

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

 

起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

 

 

 

抽象处理者(Handler):
public abstract class Handler {
	Handler nextHandler;
	public abstract void handleRequest(Request request);
	
	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}
	
}

具体处理者A(ConcreteHandler):
public class ConcreteHandlerA extends Handler {
	
	public void handleRequest(Request request) {
		if(request.getType() == 1){
			 System.out.println("HandlerA处理了:" + request.getType());
		}else if(null != nextHandler){
			nextHandler.handleRequest(request);
		}else{
			 System.out.println("无处理:" + request.getType());
		}
	}	

}

具体处理者B(ConcreteHandler):
public class ConcreteHandlerB  extends Handler {
	public void handleRequest(Request request) {
		 
			 System.out.println("HandlerB处理了:" + request.getType());
		 
	}

}

请求(可替代)
public class Request {
	int type;

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}
	
}


 

public class Client {
	public static void main(String[] args) {
		Handler handlerA = new ConcreteHandlerA();
		Handler handlerB = new ConcreteHandlerB();
		handlerA.setNextHandler(handlerB);
		
		Request request = new Request();	
		request.setType(1);
		handlerA.handleRequest(request);
		
		System.out.println("----------分割不同请求-------------");
		
		Request request2 = new Request();	
		request2.setType(2);
		handlerA.handleRequest(request2);
	}
	/*
	  	HandlerA处理了:1
		----------分割不同请求-------------
		HandlerB处理了:2
	*/
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值