设计模式原则16----责任链模式

个人博客:打开链接

责任链模式的定义

使多个对象都有机会处理请求,从而避免了请求的发送者和接收者的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

例子:古代妇女的枷锁—-三从四德

古代女子要 “三从四德”,这里的三从是什么呢?是指“未嫁从父,既嫁从夫,夫死从子”。也就是说,一位女性在结婚前听父亲的,结婚后听丈夫的,丈夫G了听儿子的,没有儿子听小叔子的。
这里写图片描述
代码:

public interface IWomen {
    //获得个人状况
    public int getType();
    //获得个人请示,你要干什么?出去逛街?约会?看电影?
    public String getRequest();
}
public class Women implements IWomen {
    /*
    * 通过一个int类型的参数来描述妇女的个人情况
    * 1 - - 未出嫁
    * 2 - - 出嫁
    * 3 -- 夫死
     */
    private int type = 0;
    private String request = "";
   public Women(int _type, String _request){
       this.type = _type;
       //便于显示,做点处理
       switch (this.type){
           case 1:
               this.request = "女儿的请求是:" + _request;
               break;
           case 2:
               this.request = "妻子的请求是:" + _request;
               break;
           case 3:
               this.request = "母亲的请求是:" + _request;
       }
   }
   public int getType(){
       return type;
   }

    @Override
    public String getRequest() {
        return request;
    }
}
public abstract class IHandler {
    public final static int FATHER_LEVEL_REQUEST = 1;
    public final static int HUSBAND_LEVEL_REQUEST = 2;
    public final static int SON_LEVEL_REQUEST = 3;
    private int level = 0;
    private IHandler nextHandler;
    public IHandler(int _level){
        this.level = _level;
    }
    public final void HandlerMessage(IWomen women){
        if(women.getType() == this.level){
            this.response(women);
        }else{
            if(this.nextHandler != null){
                this.nextHandler.HandlerMessage(women);
            }
        }
    }
    protected abstract void response(IWomen women);
    public void setNext(IHandler _handler){
        this.nextHandler = _handler;
    }
}
public class Father extends IHandler{


    public Father(){
        super(IHandler.FATHER_LEVEL_REQUEST);
    }
    @Override
    protected void response(IWomen women) {
        System.out.println("------------女儿向父亲请示------------");
        System.out.println("女儿的请示是:" + women.getRequest());
        System.out.println("父亲的答复是:同意");
    }
}
public class Husband extends IHandler {


    public Husband() {
        super(IHandler.HUSBAND_LEVEL_REQUEST);
    }

    @Override
    protected void response(IWomen women) {
        System.out.println("------------妻子向丈夫请示------------");
        System.out.println("妻子的请示是:" + women.getRequest());
        System.out.println("丈夫的答复是:同意");
    }
}
public class Son extends IHandler {

    public Son(){
        super(IHandler.SON_LEVEL_REQUEST);
    }
    @Override
    protected void response(IWomen women) {
        System.out.println("------------母亲向儿子请示------------");
        System.out.println("母亲的请示是:" + women.getRequest());
        System.out.println("儿子的答复是:同意");
    }
}
public class Client {
    public static void main(String[] args) {
        Random random = new Random();
        ArrayList<IWomen> arrayList = new ArrayList<>();
        for(int i = 0; i < 5; ++i){
            arrayList.add(new Women(random.nextInt(4), "宝宝中秋要去逛街"));
        }
        IHandler father = new Father();
        IHandler husband = new Husband();
        IHandler son = new Son();
        father.setNext(husband);
        husband.setNext(son);
        for(IWomen women:arrayList){
            father.HandlerMessage(women);
        }
    }
}

责任链模式的优缺点

  • 1:优点。责任链模式将请求和处理分开,提高系统灵活性。
  • 2:缺点。性能为题,每个请求都是从链头便利到链尾;调试不方便,链条比较长,环节比较多时。

注意

  • 1:责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后交由后续节点继续处理,最终可以处理结果也可以没有处理结果。
  • 2:链条节点数量需要控制,避免出现超长链的情况。

猜你喜欢

转载自blog.csdn.net/jinglisen/article/details/80192189