美文网首页
职责链模式

职责链模式

作者: yummy觉一 | 来源:发表于2019-09-25 09:09 被阅读0次

    对《大话设计模式》的学习总结,以备后用。

    职责链模式:

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

    职责链模式
    • Handler类定义了一个处理请求的接口:
    public abstract class Handler {
        protected Handler successor;
        // 设置继任者
        public void setSuccessor(Handler successor) {
            this.successor = successor;
        }
        // 处理请求的抽象接口
        public abstract void handleRequest(int request);
    }
    

    concreteHandler是具体处理类,如concreteHandler1concreteHandler2,从uml图看出需继承Handler类和实现handleRequest方法。

    • concreteHandler1实现:
    public class ConcreteHandler1 extends Handler {
        @Override
        public void handleRequest(int request) {
            // 满足条件则处理
            if(request  > 0 && request < 10) {
                System.out.println("ConcreteHandler1 处理了请求: " + request);
            }else { // 不满足则传递给继任者
                this.successor.handleRequest(request);
            }
        }
    }
    
    • concreteHandler2实现:
    public class ConcreteHandler2 extends Handler {
        @Override
        public void handleRequest(int request) {
            // 满足条件则处理
            if(request  >= 10 && request < 20) {
                System.out.println("ConcreteHandler2 处理了请求: " + request);
            }else { // 不满足则传递给继任者
                this.successor.handleRequest(request);
            }
        }
    }
    
    • concreteHandler3实现:
    public class ConcreteHandler3 extends Handler {
        @Override
        public void handleRequest(int request) {
            // 满足条件则处理
            if(request  >= 20 && request < 30) {
                System.out.println("ConcreteHandler3 处理了请求: " + request);
            }else { // 不满足则传递给继任者
                this.successor.handleRequest(request);
            }
        }
    }
    
    • 客户端代码实现,向链上的具体处理对象提交请求:
    public class App 
    {
        public static void main( String[] args )
        {
            Handler h1 = new  ConcreteHandler1();
            Handler h2 = new  ConcreteHandler2();
            Handler h3 = new  ConcreteHandler3();
            // 设置继任者
            h1.setSuccessor(h2);
            h2.setSuccessor(h3);
            //从链的起始端开始处理请求
            int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
            for(int i = 0; i < requests.length; i++) {
                h1.handleRequest(requests[i]);
            }
        }
    }
    
    职责链的特点:
    • 当客户提交一个请求时,请求沿链传递直至有一个ConcreteHandler对象负责处理它。
    • 职责链可简化为对象之间的相互连接,它们仅需保持一个指向其后继者的引用,而无需保持所有候选接受者的引用。
    • 随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
    • 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

    相关文章

      网友评论

          本文标题:职责链模式

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