美文网首页
责任链模式

责任链模式

作者: taijielan | 来源:发表于2019-04-02 14:28 被阅读0次

责任链模式是23种设计模式种的一种,是一种行为型模型,传统的责任链模式是有多个对象,每个对象持有另一个对象的引用,,这样就形成一条链,请求将会在这个链上传递,具体哪个对象将会调用事先并不会知道。


image.png
public interface Handler {
    void operate();
}
public  abstract class AbstractHandler {
    private Handler handler;

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }
}

public class MyHanlder extends AbstractHandler implements Handler {
    private String name;
    public MyHanlder(String name){
        this.name  = name;
    }
    @Override
    public void operate() {
        Log.e("info","----name:"+name);
        if(null != getHandler()) {
            getHandler().operate();
        }
    }
}

 MyHanlder myHanlder1 = new MyHanlder("test1");
 MyHanlder myHanlder2 = new MyHanlder("test2");
 MyHanlder myHanlder3 = new MyHanlder("test3");
 MyHanlder myHanlder4 = new MyHanlder("test4");
 myHanlder1.setHandler(myHanlder2);
 myHanlder2.setHandler(myHanlder3);
 myHanlder3.setHandler(myHanlder4);
 myHanlder1.operate();

还有一种变种的责任链模型,组合了其他模式,可以动态的调整请求的内容,将请求和返回都封装到责任链中,不断传递责任链给到不同的对象,直到有对象处理请求或者返回默认的结果。


image.png
public class Request {
    private String name;
    private String reason;
    private int day;
    private String groupInfo;
    private String manageInfo;
    private String customInfo;
    private String departmentInfo;

    public Request(Builder builder) {
        this.name = builder.name;
        this.reason = builder.reason;
        this.day = builder.day;
        this.groupInfo = builder.groupInfo;
        this.manageInfo = builder.manageInfo;
        this.customInfo = builder.customInfo;
        this.departmentInfo = builder.departmentInfo;
    }

    public static class Builder {
        private String name;
        private String reason;
        private int day;
        private String groupInfo;
        private String manageInfo;
        private String customInfo;
        private String departmentInfo;

        public Builder() {
        }

        public Builder newRequst(Request request) {
            this.name = request.name;
            this.reason = request.reason;
            this.day = request.day;
            this.groupInfo = request.groupInfo;
            this.manageInfo = request.manageInfo;
            this.customInfo = request.customInfo;
            this.departmentInfo = request.departmentInfo;
            return  this;
        }

        public Request builder() {
            return new Request(this);
        }


        public Builder setName(String name) {
            this.name = name;
            return this;
        }

            public Builder setReason (String reason){
                this.reason = reason;
                return this;
            }

            public Builder setDay ( int day){
                this.day = day;
                return this;
            }

            public Builder setGroupInfo (String groupInfo){
                this.groupInfo = groupInfo;
                return this;
            }

            public Builder setManageInfo (String manageInfo){
                this.manageInfo = manageInfo;
                return this;
            }

            public Builder setCustomInfo (String customInfo){
                this.customInfo = customInfo;
                return this;
            }

            public Builder setDepartmentInfo (String departmentInfo){
                this.departmentInfo = departmentInfo;
                return this;
            }

    }


    public String getName() {
        return name;
    }

    public String getReason() {
        return reason;
    }

    public int getDay() {
        return day;
    }

    public String getGroupInfo() {
        return groupInfo;
    }

    public String getManageInfo() {
        return manageInfo;
    }

    public String getCustomInfo() {
        return customInfo;
    }

    public String getDepartmentInfo() {
        return departmentInfo;
    }

    @Override
    public String toString() {
        return "Request{" +
                "name='" + name + '\'' +
                ", reason='" + reason + '\'' +
                ", day=" + day +
                ", groupInfo='" + groupInfo + '\'' +
                ", manageInfo='" + manageInfo + '\'' +
                ", customInfo='" + customInfo + '\'' +
                ", departmentInfo='" + departmentInfo + '\'' +
                '}';
    }
}


public class Response {
    private boolean isArgee;
    private String info;

    public Response(boolean isArgee, String info) {
        this.info = info;
        this.isArgee = isArgee;
    }

    public boolean isArgee() {
        return isArgee;
    }

    public void setArgee(boolean argee) {
        isArgee = argee;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Response{" +
                "isArgee=" + isArgee +
                ", info='" + info + '\'' +
                '}';
    }
}


public interface Agree {
    //处理请求
    Response deal(Chain chain);

    interface  Chain{
        Request request();
        Response proceed(Request request);
    }
}


public  class  RealChain implements Agree.Chain {
    private Request request;
    private List<Agree> list;
    private int index;
    public RealChain(Request request , List<Agree> l, int i ){
        this.request = request;
        this.list = l;
        this.index = i;
    }
    @Override
    public Request request() {
        return request;
    }

    @Override
    public Response proceed(Request request) {
        Response procees  =null;
        if(list.size() >index){
            RealChain groupChain = new RealChain(request,list,index+1);
            Agree agree  = list.get(index);
            procees  = agree.deal(groupChain);
        }
        return  procees;
    }
}

在deal 中修改了request请求

public class DepartmentLeader implements Agree {
    @Override
    public Response deal(Chain chain) {
        Request request = chain.request();
        Log.e("info","----"+request.toString());
        if(request.getDay() >5){
            Request request1 = new Request.Builder().newRequst(request).setDepartmentInfo("每月的KPI考核还不错,可以批准").builder();
           return chain.proceed(request1);
        }
        return new Response(true,"Depatemne 不要着急,把事情处理完再回来") ;
    }
}

public class GroupLeader implements Agree {
    @Override
    public Response deal(Chain chain) {
        Request request  = chain.request();
        Log.e("info" ,request.toString());
        if(request.getDay()>1){
            Request newRequest = new Request.Builder().newRequst(request).setGroupInfo(request.getName()+"平时表现不错,而且现在项目也不忙").builder();
            return  chain.proceed(newRequest);
        }
        return new Response(true,"group : to早点把事情办完,项目离不开你");
    }
}
public class ChainOfResponsibilityClient {
    private List<Agree> list;
    public ChainOfResponsibilityClient(){
        this.list = new ArrayList<>();
    }

    public void add(List<Agree> list) {
        this.list.addAll(list);
    }
    public Response excute(Request request){
        ArrayList<Agree> list = new ArrayList<>();
        list.addAll(list);
        list.add(new GroupLeader());
        list.add(new DepartmentLeader());
        RealChain realChain = new RealChain(request,list,0);
        return  realChain.proceed(request);
    }

}

最后的调用

     Request request = new Request.Builder().setName("张山").setDay(5).setReason("我有事").builder();
     ChainOfResponsibilityClient chainOfResponsibilityClient = new ChainOfResponsibilityClient();
     Response response =chainOfResponsibilityClient.excute(request);
     Log.e("info","response:"+response.toString());

相关文章

网友评论

      本文标题:责任链模式

      本文链接:https://www.haomeiwen.com/subject/zfhgbqtx.html