一个有问题的责任链模式

先上出概念图:

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

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章