设计模式之责任链模式(Chain of Responsibility Pattern)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangchengming1/article/details/85049192
  • 责任链模式定义
    责任链的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果。其定义为:Avoid coupling the sender of a request to its receiver by giving more than one project a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递改请求,直到有对象处理它为止。
  • 责任链模式通用类图
    在这里插入图片描述
  • 责任链模式通用代码
    首先是抽象处理者,①定义一个请求的处理方法handlerMessage。②定义一个链的编排方法。③定义具体的请求者必须实现的方法。
public abstract class Handler {

	private Handler nextHandler;

	@SuppressWarnings("unlikely-arg-type")
	public final Response hanleMessage(Request request) {

		Response response = null;

		if (this.getHandlerLevel().equals(request.getRequestLevel())) {
			response = this.echo(request);
		} else {
			if(this.nextHandler != null) {
				response = this.nextHandler.hanleMessage(request);
			}else {
				
			}
		}
		return response;
	}

	public void setNext(Handler _handler) {
		this.nextHandler = _handler;
	}

	protected abstract Level getHandlerLevel();

	protected abstract Response echo(Request request);
}

public class Level {

}

public class Request {

	public Level getRequestLevel() {
		return null;
	}
}

public class Response {

}

具体的处理者1

public class ConcreteHandler1 extends Handler {

	@Override
	protected Level getHandlerLevel() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected Response echo(Request request) {
		// TODO Auto-generated method stub
		return null;
	}
}

具体的处理者2

public class ConcreteHandler2 extends Handler{

	@Override
	protected Level getHandlerLevel() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected Response echo(Request request) {
		// TODO Auto-generated method stub
		return null;
	}
}

具体的处理者3

public class ConcreteHandler3 extends Handler{

	@Override
	protected Level getHandlerLevel() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected Response echo(Request request) {
		// TODO Auto-generated method stub
		return null;
	}
}

调用类

public class Client {

	public static void main(String[] args) {
		
		// 声明处理节点
		Handler h1 = new ConcreteHandler1();
		Handler h2 = new ConcreteHandler2();
		Handler h3 = new ConcreteHandler3();
		
		// 处理顺序
		h1.setNext(h2);
		h1.setNext(h3);
		
		// 返回结果
		Response response = h1.hanleMessage(new Request());
	}
}
  • 责任链模式实例类图
    其实责任链模式在我们工作中还是比较常见的,比如提交请假申请的流程就可以看做一个责任链模式,首先老大给批准,接下来经理批准,最后总监批准,这个过程就是一个链。
    在这里插入图片描述
  • 责任链模式实例代码
    首先是抽象处理者
public abstract class Handler {
	/**
	 * 持有下一个处理请求的对象
	 */
	protected Handler successor = null;

	/**
	 * 取值方法
	 */
	public Handler getSuccessor() {
		return successor;
	}

	/**
	 * 设置下一个处理请求的对象
	 */
	public void setSuccessor(Handler successor) {
		this.successor = successor;
	}

	/**
	 * @return 成功或失败的具体通知
	 */
	public abstract String handleRequest(String user, int dayNum);

}

接下来分别是TeamLeader,Manager和GeneralManager

public class TeamLeader extends Handler {

	@Override
	public String handleRequest(String user, int dayNum) {

		String str = "";
		// TL权限比较小
		if (dayNum < 3) {
			if ("张三".equals(user)) {
				str = "成功:TL同意【" + user + "】请假" + dayNum + "天";
			} else {
				// 其他人一律不同意
				str = "其他人一律不同意";
			}
		} else {
			// 请假超过三天的
			if (getSuccessor() != null) {
				return getSuccessor().handleRequest(user, dayNum);
			}
		}
		return str;
	}
}
public class Manager extends Handler{

	@Override
	public String handleRequest(String user, int dayNum) {

		String str = "";
		// 经理权限相对较大
		if (dayNum < 5) {
			if ("张三".equals(user)) {
				str = "成功:经理同意【" + user + "】请假" + dayNum + "天";
			} else {
				// 其他人一律不同意
				str = "其他人一律不同意";
			}
		} else {
			// 请假超过五天的
			if (getSuccessor() != null) {
				return getSuccessor().handleRequest(user, dayNum);
			}
		}
		return str;
	}

}
public class GeneralManager extends Handler {

	@Override
	public String handleRequest(String user, int dayNum) {

		String str = "";
		// 总监权限最大
		if (dayNum < 10) {
			if ("张三".equals(user)) {
				str = "成功:总监同意【" + user + "】请假" + dayNum + "天";
			} else {
				// 其他人一律不同意
				str = "其他人一律不同意";
			}
		} else {
			// 如果还有后继的处理对象,继续传递
			if (getSuccessor() != null) {
				return getSuccessor().handleRequest(user, dayNum);
			}
		}
		return str;
	}
}

调用类

public class Client {

	public static void main(String[] args) {

		Handler h1 = new TeamLeader();
		Handler h2 = new Manager();
		Handler h3 = new GeneralManager();
		
		//开始测试
        String test1 = h1.handleRequest("张三", 2);
        System.out.println("test1 = " + test1);
        String test2 = h3.handleRequest("李四", 2);
        System.out.println("test2 = " + test2);
        System.out.println("---------------------------------------");
        
        String test3 = h2.handleRequest("张三", 4);
        System.out.println("test3 = " + test3);
        String test4 = h3.handleRequest("李四", 4);
        System.out.println("test4 = " + test4);
        System.out.println("---------------------------------------");
        
        String test5 = h3.handleRequest("张三", 7);
        System.out.println("test5 = " + test5);
        String test6 = h3.handleRequest("李四", 7);
        System.out.println("test6 = " + test6);
	}

}

输出结果

test1 = 成功:TL同意【张三】请假2天
test2 = 其他人一律不同意
---------------------------------------
test3 = 成功:经理同意【张三】请假4天
test4 = 其他人一律不同意
---------------------------------------
test5 = 成功:总监同意【张三】请假7天
test6 = 其他人一律不同意

参考书籍:设计模式之禅
实例代码放在这里

猜你喜欢

转载自blog.csdn.net/wangchengming1/article/details/85049192
今日推荐