设计模式系列16---响应请求的责任链模式

enter image description here

所谓责任落实到位,落实到人,就是要找对特定事情有处理权限的人。

我们以法院为例子,小事情就在基层人民法院处理了,大一点的事情就找地市级的中级法院,如果事情闹大的就省级的高级人民法院,如果这事件特别重大,那就是最高人民法院了。

所以我们看下四个级别:

最高人民法院 > 高级人民法院  > 中级人民法院 > 基层人民法院

那么问题来了,当年窦娥冤情换成现在是归谁管呢?可以跳级跑去告御状吗?

enter image description here

代码实现

现在我们先抽象出一个案例的基本元素。

public interface ICase {

    public int getLevel();

    public String getRequest();
}

我们的案子有冤情级别,和冤情内容。

接着我们来写我们的窦氏。

public class DouWomen implements ICase {

    private int level; //案情级别
    private String request;//案情内容

    public DouWomen(int level, String request) {
        this.level = level;
        this.request = request;
    }

    @Override
    public int getLevel() {
        return level;
    }

    @Override
    public String getRequest() {
        return request;
    }
}

我们的窦氏是一个背负了案子的女人,所有实现了这个案子Icase接口。

接着我们来看下我们的法院基本情况

public abstract class Court {

    protected static final int LOCAL_LEVEL = 1;
    protected static final int MID_LEVEL = 2;
    protected static final int HIGH_LEVEL = 3;
    protected static final int TOP_LEVEL = 4;
    private int level = 0;
    private Court nextCourt;

    public Court(int level) {
        this.level = level;
    }

    public final void HandleMessage(ICase iCase) {
        if (iCase.getLevel() == this.level) {
            this.response(iCase);
        } else {
            if (this.nextCourt != null) {
                this.nextCourt.HandleMessage(iCase);
            } else {
                System.out.println("六月飞雪");
            }
        }
    }

    public void setNextCourt(Court _handler) {
        this.nextCourt = _handler;
    }

    public abstract void response(ICase iCase);

}

我们的法院有处理的级别,和如果超过当前级别对应的下一个更高级的nextCourt,如果超过最大级别,没人处理得了,那就只有六月飞雪了。

然后我们的基层法院

public class LocalCourt extends Court {

    public LocalCourt() {
        super(LOCAL_LEVEL);
    }

    @Override
    public void response(ICase iCase) {    
        System.out.print("基层法院:处理案情" + iCase.getRequest());
    }
}

接着是中级法院

public class MidCourt extends Court {

    public MidCourt() {
        super(MID_LEVEL);
    }

    @Override
    public void response(ICase iCase) {    
        System.out.print("中级法院:处理案情" + iCase.getRequest());
    }    
}

然后是高级

public class HighCourt extends Court {

    public HighCourt() {
        super(HIGH_LEVEL);
    }

    @Override
    public void response(ICase iCase) {
        System.out.print("高级法院:处理案情" + iCase.getRequest());
    }
}

最后是终极

public class HighCourt extends Court {

    public HighCourt() {
        super(TOP_LEVEL);
    }

    @Override
    public void response(ICase iCase) {
        System.out.print("最高人民法院:处理案情" + iCase.getRequest());
    }
}

有了这么长的铺垫,终于可以写审批了

public class Judgement {

    public static void main(String[] args) {

        DouWomen douWomen = new DouWomen(999, " 我好冤啊");

        Court localCourt = new LocalCourt();
        Court midCourt = new MidCourt();
        Court highCourt = new HighCourt();
        Court topCourt = new TopCourt();

        localCourt.setNextCourt(midCourt);
        midCourt.setNextCourt(highCourt);
        highCourt.setNextCourt(topCourt);
        topCourt.setNextCourt(null);

        localCourt.HandleMessage(douWomen);
    }
}    

我们的最终审批写好了,从本地的法院开始处理!
但我们知道最后没人处理得了,所有只有六月飞雪了。


类图

enter image description here

后记

在写服务器的时候,我们经常会写一些过滤的操作,其中就有责任链的影子。
我们的责任链的好处是减低了耦合度,一个对象无需要关心到底接下来给谁,只需要专心处理自己的事情就好了。
不过有个问题,就是不能保证我们的请求被处理,例如我们的窦娥。
另外,责任链调试不是很方便。

热评文章