薛磊 Job Seeker

23种设计模式——19.Chain Of Responsibility 责任链(行为型模式)


动机(Motivation)

  在软件构件过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。

  如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

意图(Intent)

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

结构


抽象的处理者实现三个职责:
  一是定义一个请求的处理方法handleMessage,唯一对外开放的方法;
  二是定义一个链的编排方法setNext,设置下一个处理者;
  三是定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLever和具体的处理任务echo。

Chain of Responsibility模式的几个要点

  • Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后整整的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能常出现“变化脆弱”的症状,责任链的目的就是将二者解耦,从而更好地应对变化。

  • 应用了Chain of Responsibility模式后,对象的职责分派将更具有灵活性。我们可以在运行时动态添加/修改请求的处理职责。

  • 如果请求传递到责任链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。

示例代码

实例:古代女子三从四德,结婚之前听从父亲,结婚之后听从丈夫,丧偶之后听从儿子。 抽象处理者:

public abstract class Handler{
	private Handler nextHandler;
	
	//每个处理者都必须对请求做出处理
	public final Request handleMessage(Request request)
		Response response = null;
		//判断是否是自己的处理级别
		if(this.getHandlerLevel().equals(request.getReqeustLevel())){
			response = this.echo(request);
		}else{//不属于自己的处理级别
			//判断是否有下一个处理者
			if(this.nextHandler != null){
				response = this.nextHandler.handleMessage(request);
			}else{
				//没有适当的处理者,业务自行处理
			}
		}
		return response;
	}
	
	//设置下一个处理者是谁
	public void setNext(Handler handler){
		this.nextHandler = handler;
	}

	//每个处理者都有一个处理级别
	protected abstract Level getHandlerLevel();

	//每个处理者都必须实现处理任务
	protected abstract Response echo(Request request);
}

具体处理者:

public class ConcreteHandlerl extends Handler{
	//定义自己的处理逻辑
	protected Response echo(Reuqest request){
		return null;
	}

	//设置自己的处理级别
	protected Level getHandlerLevel(){
		return null;
	}
}

public class ConcreteHandler2 extends Handler{
	//定义自己的处理逻辑
	protected Response echo(Reuqest request){
		return null;
	}

	//设置自己的处理级别
	protected Level getHandlerLevel(){
		return null;
	}
}

public class ConcreteHandler3 extends Handler{
	//定义自己的处理逻辑
	protected Response echo(Reuqest request){
		return null;
	}

	//设置自己的处理级别
	protected Level getHandlerLevel(){
		return null;
	}
}
	

模式中有关框架代码:

public class Level{
	//定义一个请求和处理等级
}

public class Request{
	//请求的等级
	public Level getRequestLevel(){
		return null;
	}
}

public class Response{
	//处理返回的数据
}

场景类:

public class Client{
	publci static void main(String[] args){
		//声明所有的处理节点
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();

		//设置链这种的阶段顺序1-->2-->3
		handler1.setNext(handler2);
		handler2.setNext(handler3);

		//提交请求,返回结果
		Response response = handler1.handlerMessage(new Request());
	}
}

Comments

Content