版权声明:本文为博主原创文章,未经博主允许不得转载。 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 = 其他人一律不同意
参考书籍:设计模式之禅
实例代码放在这里。