一个有问题的责任链模式

mac2024-05-17  30

先上出概念图:

 图中主要是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):该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。由于具体处理者持有对下一个处理者的引用,因此,如果需要,处理者可以访问下一个处理者。

内容暂时如上, 不足的地方还在改正!

下一节上一个具体的一个用例子!

 

最新回复(0)