职责链模式

Posted 程姐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了职责链模式相关的知识,希望对你有一定的参考价值。

职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

职责链的好处:客户提交一个请求时,请求是沿着链传递直至有一个职责对象负责处理它。

请求不用管那个对象来处理,反正最后该请求就是会被处理。这就使得接受者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。

在客户端定义链的结构,也就是说,可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

但是,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,这就很糟糕,需要事先考虑全面。

可解决原来大量的分支判断造成难维护、灵活性差的问题。

Request类

package chain_of_responsibility;

public class Request {
    private String requstType;
    private String requestContent;
    private int requestNumber;
    private String requestName;
    public String getRequstType() {
        return requstType;
    }
    public void setRequstType(String requstType) {
        this.requstType = requstType;
    }
    public String getRequestContent() {
        return requestContent;
    }
    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }
    public int getRequestNumber() {
        return requestNumber;
    }
    public void setRequestNumber(int requestNumber) {
        this.requestNumber = requestNumber;
    }
    public String getRequestName() {
        return requestName;
    }
    public void setRequestName(String requestName) {
        this.requestName = requestName;
    }
    
}

Manager类

package chain_of_responsibility;

public abstract class Manager {
    private String name;
    protected Manager supperManager;
    
    public void setManager(Manager supperManager){
        this.supperManager = supperManager;
    }
    
    public Manager(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public abstract void requestApply(Request req);
}

JLManager类

package chain_of_responsibility;

public class JLManager extends Manager {

    public JLManager(String name) {
        super(name);
    }

    @Override
    public void requestApply(Request req) {
        if("请假".equals(req.getRequstType())&&req.getRequestNumber()<3){
            System.out.println("请假人:"+req.getRequestName()+",请假内容:"+req.getRequestContent()+"请假天数:"+req.getRequestNumber()+"。经理批准了");
        }else{
            if(supperManager!=null){
                supperManager.requestApply(req);
            }
        }
    }
}

ZJManager类

package chain_of_responsibility;

public class ZJManager extends Manager {

    public ZJManager(String name) {
        super(name);
    }

    @Override
    public void requestApply(Request req) {
        if("请假".equals(req.getRequstType())){
            System.out.println("请假人:"+req.getRequestName()+",请假内容:"+req.getRequestContent()+"请假天数:"+req.getRequestNumber()+"。总监批准了");
        }else if("加薪".equals(req.getRequstType())&&req.getRequestNumber()<=500){
            System.out.println("申请加薪人:"+req.getRequestName()+",加薪说明:"+req.getRequestContent()+"加薪数:"+req.getRequestNumber()+"。总监批准了");
        }else{
            if(supperManager!=null){
                supperManager.requestApply(req);
            }
        }
    }
}

ZJLManager类

package chain_of_responsibility;

public class ZJLManager extends Manager {

    public ZJLManager(String name) {
        super(name);
    }

    @Override
    public void requestApply(Request req) {
        if("请假".equals(req.getRequstType())){
            System.out.println("请假人:"+req.getRequestName()+",请假内容:"+req.getRequestContent()+"请假天数:"+req.getRequestNumber()+"。总经理批准了");
        }else if("加薪".equals(req.getRequstType())&&req.getRequestNumber()<=2000){
            System.out.println("申请加薪人:"+req.getRequestName()+",加薪说明:"+req.getRequestContent()+"加薪数:"+req.getRequestNumber()+"。总经理批准了");
        }else{
            System.out.println("要求过了,驳回申请");
        }
    }
}

Business类

package chain_of_responsibility;

public class Business {

    public static void main(String[] args) {
        Request req = new Request();
        req.setRequstType("请假");
        req.setRequestContent("家里有事");
        req.setRequestNumber(2);
        req.setRequestName("新人");
        Manager jl = new JLManager("经理");
        Manager zj = new ZJManager("总监");
        Manager zjl = new ZJLManager("总经理");
        jl.setManager(zj);
        zj.setManager(zjl);
        jl.requestApply(req);
        
        Request req1 = new Request();
        req1.setRequstType("请假");
        req1.setRequestContent("家里有事");
        req1.setRequestNumber(5);
        req1.setRequestName("新人");
        jl.requestApply(req1);
        
        Request req2 = new Request();
        req2.setRequstType("加薪");
        req2.setRequestContent("表现优秀");
        req2.setRequestNumber(1000);
        req2.setRequestName("新人");
        jl.requestApply(req2);
        
        Request req3 = new Request();
        req3.setRequstType("加薪");
        req3.setRequestContent("表现特好");
        req3.setRequestNumber(2500);
        req3.setRequestName("新人");
        jl.requestApply(req3);
    }

}

 

以上是关于职责链模式的主要内容,如果未能解决你的问题,请参考以下文章

职责链模式vs状态模式区别

利用职责链模式分解If else

设计模式 行为型模式 -- 职责链模式(JDK源码分析:FilterChain(过滤器))

JAVA设计模式大总结(二十三)--- b站尚硅谷设计模式之 职责链模式 图解 + 代码 整理(超详)

职责链模式

职责链模式分析结构图与基本代码