设计模式-责任链模式


定义

使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系

二、 责任链模式的使用场景

多个对象可以请求同一请求,但具体由哪个对象处理则在运行时候动态决定
在请求处理者不明确的情况下向多个对象中的一个提交一个请求
需要动态指定一组对象处理请求

UML图

类图

代码案例

定一个抽象的处理类 关键在与持有一个内部的自己引用


public  abstract class Handler {

    public Handler soccessor;

    public abstract void handleRequest(String condition);
}

我们定义两个链条 大概是根据逻辑判断是自己要处理还是交给其他人处理,如果自己处理就自己处理掉 如果别人处理是别人处理掉


public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("ConcreteHandler1")) {//可以是你要处理的方法
            System.out.println("ConcreteHandler1 handler");
            return;
        } else {
            if (soccessor != null) {
                soccessor.handleRequest(condition);
            }
        }
    }
}

public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("ConcreteHandler2")) {//可以是你要处理的方法
            System.out.println("ConcreteHandle2 handler");
            return;
        } else {
            if (soccessor != null) {
                soccessor.handleRequest(condition);
            }
        }
    }
}

我们看在客户端 把所有链条都生产出来 然后给链条指定后前后关系,然后就在开始的链条上开始请求,因为如果有没有处理会进行下一环节,如果有处理那么就交给当前去处理


public class Client 
    @TestOnly
    public void test() {

        ConcreteHandler1 concreteHandler1 = new ConcreteHandler1();
        ConcreteHandler2 concreteHandler2 = new ConcreteHandler2();
        concreteHandler1.soccessor = concreteHandler2;
        concreteHandler1.handleRequest("ConcreteHandler1");
    }

}

四、优缺点
优点
降低耦合度。它将请求的发送者和接收者解耦
简化了对象,使得对象不需要知道链的结构
增强给对象指派职责的灵活性,允许动态地新增或者删除责任链
增加新的请求处理类方便

缺点
不能保证请求一定被接收;
系统性能将受到一定影响,调试时不方便,可能会造成循环调用


  TOC