责任链设计模式

2018, Apr 20    

责任链设计模式

责任链模式:让一个请求被多个对象处理

  • 优点:请求和处理分开,解耦
  • 缺点:链太长,会有性能问题
  1. 请求类:每个请求都有自己的级别

    public class Request {
    	//请求的等级
    	public Level getRequestLevel(){
    		return null;
    	}
    }
    
  2. 级别类和处理类

    public class Level {
    	//定义一个请求和处理等级
    }
       
    public class Response {
    	//处理者返回的数据
    }
    
  3. 抽象处理者:实现final必须的处理方法,声明下一任处理者变量,并提供set方法。定义抽象处理函数和抽象级别函数。

    public abstract class Handler {
    	private Handler nextHandler;
    	//每个处理者都必须对请求做出处理
    	public final Response handleMessage(Request request){
    		Response response = null;
    		//判断是否是自己的处理级别
    if(this.getHandlerLevel().equals(request.getRequestLevel())){
    	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);
    
  4. 具体处理者

    public class ConcreteHandler1 extends Handler {
    	//定义自己的处理逻辑
    	protected Response echo(Request request) {
    		//完成处理逻辑
    		return null;
    	}
    	//设置自己的处理级别
    	protected Level getHandlerLevel() {
    		//设置自己的处理级别
    		return null;
    	}
    }
    

测试函数

public class Client {
	public 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());
	}
}