设计模式之责任链模式

设计模式 Java About 1,922 words

作用

为请求创建了一个接收者对象的链,将请求和处理分开,实现解耦,提高系统的灵活性。

简化了对象,使对象不需要知道链的结构。

原理

chain.png

Handler:抽象的处理者,定义了一个处理请求的接口,同时含有下一个Handler。

ConcreteHandlerA/B:具体的处理者,处理它自己负责的请求,可以访问它的下一个处理者,如果可以处理当前请求,则处理,否则就将该请求交给下一个处理者去处理,从而形成一个责任链。

Request:含有多个属性,表示一个请求。

案例

Handler

public abstract class Approver {
    Approver nextApprover;

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void processRequest(Request request);
}

ConcreteHandler

public class JuniorApprover extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.price <= 100) {
            System.out.println("<= 100 junior 处理");
        } else {
            setNextApprover(new SeniorApprover());
            nextApprover.processRequest(request);
        }
    }
}

public class SeniorApprover extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.price <= 200) {
            System.out.println("<= 200 senior 处理");
        } else {
            setNextApprover(new SuperiorApprover());
            nextApprover.processRequest(request);
        }
    }
}

public class SuperiorApprover extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.price > 200) {
            System.out.println("> 200 superior 处理");
        } else {
            setNextApprover(new JuniorApprover());
            nextApprover.processRequest(request);
        }
    }
}

Request

public class Request {

    int price;

}

调用

public class Client {
    public static void main(String[] args) {
        Request request = new Request();
        request.price = 250;
        Approver approver = new JuniorApprover();
        approver.processRequest(request);
    }
}

源码

SpringMVCHandlerExecutionChain.png

org.springframework.web.servlet.DispatcherServlet#doDispatch

org.springframework.web.servlet.HandlerExecutionChain

Views: 2,797 · Posted: 2020-01-07

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh