先上出概念图:
图中主要是2个接口 :
MyExecutor: 主要包含执行方法(可以理解未一个处理请求的方法,扩展时请求可以定义为一个对象)
MyExecutorChain: 主要包含新增 执行器方法 和 另一个执行方法(遍历执行器去调用执行器的执行方法)
MyDefaultExecutorChain: 主要是一个 链表集合LinkedList(包含了多个执行器) + 一个索引(也可以理解为游标: 用于标识当前处理请求的执行器)
具体内容如下: 内部还有多个点有问题: 仅仅作为理解责任链模式的一个demo:
public interface MyExecutor {
/**
* 处理请求方法
*/
int run(MyExecutorChain myExecutorChain);
}
public interface MyExecutorChain<T> {
MyExecutorChain add(MyExecutor myExecutor);
/**
* 添加处理对象: 返回处理请求结果
* 0 : 表示成功
* 1 : 表示失败
* 2 : 表示没有结果
*/
int exec(T request);
}
public class Request {
private String requestStr;
}
public class WorldMyDefaultExecutorChain extends AbstractExecutor {
public WorldMyDefaultExecutorChain(Request request) {
super(request);
}
@Override
public int run(MyExecutorChain myExecutorChain) {
System.out.println(" World (项目经理) 接收请求: " + request.toString());
System.out.println(" World (项目经理) 处理请求: " + request.toString());
if(request.toString().contains("原因")) {
return myExecutorChain.exec(request);
} else {
System.out.println("World (项目经理) 处理结果: " + "请假未写明原因,请写清楚请假原因.");
return 1;
}
}
}
public class LandyMyDefaultExecutorChain extends AbstractExecutor {
public LandyMyDefaultExecutorChain(Request request) {
super(request);
}
@Override
public int run(MyExecutorChain myExecutorChain) {
//处理逻辑
System.out.println(" Landy(组长) 接收请求: " + request.toString());
System.out.println(" Landy(组长) 处理请求: " + request.toString());
//如果同意的话就继续往下传递: 3天时间超过权限
if(request.toString().contains("三")) {
System.out.println("Landy(组长) 处理结果: " + "请假时间超过权限,转到项目经理.");
return myExecutorChain.exec(super.request);
} else {
return 1;
}
}
}
public abstract class AbstractExecutor implements MyExecutor {
//使用protected 限制访问范围 : 同时不用提供外部访问方法: 因为只需要将该对象在链路上传递就可以l
protected Request request;
public AbstractExecutor(Request request) {
this.request = request;
}
}
public class Test {
public static void main(String[] args) {
Request request = new Request();
request.setRequestStr("我想请假,三天,请批准..............");
Request request1 = new Request();
request1.setRequestStr("我想请假,两天,请批准..............原因是: 想请假.....");
MyDefaultExecutorChain chain = new MyDefaultExecutorChain();
LandyMyDefaultExecutorChain landyMyDefaultExecutorChain = new LandyMyDefaultExecutorChain(request);
WorldMyDefaultExecutorChain worldMyDefaultExecutorChain = new WorldMyDefaultExecutorChain(request);
chain.add(landyMyDefaultExecutorChain);
chain.add(worldMyDefaultExecutorChain);
int result = chain.exec(request);
System.out.println("最终处理结果.......................如下................");
if(result == 0) {
System.out.println("请求处理成功!");
}
if(result == 1) {
System.out.println("请求被拒绝!");
} else {
System.out.println("请求处理没有结果,请重新发起申请!");
}
}
}
最后上出责任链模式的基本概念:
责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。
责任链模式英文原话是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving object and pass the request along the chain until an object handles it.
翻译:使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止。
责任链模式的重点在“链上”,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果。
角色:
抽象处理者(Handler)角色:该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。
具体处理者(Concrete Handler):该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。由于具体处理者持有对下一个处理者的引用,因此,如果需要,处理者可以访问下一个处理者。
内容暂时如上, 不足的地方还在改正!
下一节上一个具体的一个用例子!