设计模式之责任链模式
2017-09-06 本文已影响88人
慕涵盛华
目录
定义
责任链模式(Chain of Responsibility)是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链的定义有些抽象,其实就是使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象形成一条链,并沿着这条链传递该请求,直到有对象处理它为止。就像我们上学时在班级上传递小纸条一样,一个同学传递给另一个同学,如果是传给该同学的那么该同学接受,传递终止,否则传递给下一个同学。在这其中一个一个的同学组成一条链,在这条链上的每个同学都有可能接收纸条(处理请求),如果一个同学要传递给下一个同学就要知道同学的名字(引用)。
使用场景
- 多个对象能够处理同一请求,具体处理则在运行时动态确定
- 在请求矗立着不明确的时候向多个对象提交同一个请求
- 需要动态制定一组对象处理请求
代码运用
- 抽象处理者(Handler)角色:定义出一个处理请求的接口。可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
public abstract class Handler {
public Handler nextHandler;
public void handleRequest(Request request){
if(getHandleLevel()==request.getRequestLevel())
{
handle(request);
}else {
if(nextHandler!=null)
{
nextHandler.handleRequest(request);
}else {
System.out.println("----> 所有的处理对象都不能处理它");
}
}
}
/**
* 每个处理者的对象的具体处理方式
* @param Request
*/
public abstract void handle(Request request);
/**
* 每个处着对象处理的级别
* @return
*/
public abstract int getHandleLevel();
}
//请求的抽象封装类
public abstract class Request {
private Object object;
public Request(Object object){
this.object=object;
}
/**
* 具体的内容对象
* @return
*/
public Object getContent(){
return object;
}
/**
* 获取请求级别
*/
public abstract int getRequestLevel();
}
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下一个对象。由于具体处理者持有对下一个对象的引用,因此,如果需要,具体处理者可以访问下一个对象。
public class ConcreteHandler extends Handler{
@Override
public void handle(Request request) {
System.out.println("----handle1 处理请求: "+request.getRequestLevel());
}
@Override
public int getHandleLevel() {
return 1;
}
}
-
发送者发送请求
public class Client { public static void main(String[] args) { //确定链式关系 Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); Handler handler3=new ConcreteHandler3(); handler1.nextHandler=handler2; handler2.nextHandler=handler3; //建立请求 Request request=new Request("请求1"); handler1.handleRequest(request); } }
首先由handler1处理请求,如果请求不是给它的,就会传递下一个(handler2)因为handler1有handler2的引用( handler1.nextHandler=handler2)。