责任链模式——消除大量的 else if

设计模式的使用是将元数据从逻辑代码中剥离出来,避免因元数据(Metadata)变化导致修改程序。程序本身只是逻辑的集合,而元数据(辅助程序行为,诸如语言包文件)应集中在配置文件里;待处理的数据来自外部输入(用户输入、本地文件、数据库等)

责任链模式属于行为模式中的一种,特别关注对象之间的通信。主要解决职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
责任链的优点接受者和发送者都没有对方的信息,且链中的自己也不知道整个链的结构,他们仅需保持一个指向其后继者的引用。这大大降低了耦合度。还可以随时随地增加或者修改一个请求的结构,增强了灵活性和扩展性。基于这样的框架,它的代码总量也许比原来的要多,但你不再需要在一堆if else中仔细推敲代码执行的前提条件。

责任链模式——消除大量的 else if_第1张图片

// 定义一个处理请求的接口
public abstract class Handler {

     protected Handler successor;

     public void setSuccessor(Handler successor) { // 设置下一个处理者
         this.successor = successor;
     }

     public abstract void HandlerRequest(int request); // 请求处理逻辑

}

public class ConcreteHandler1 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request >= 0 && request <= 10) {
            System.out.println("ConcreteHandler1 处理0到10的请求 request = " + request);
        } else {
            successor.HandlerRequest(request); // 将请求发送给下一位
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request > 10 && request <= 20) {
            System.out.println("ConcreteHandler2 处理10到20的请求 request = " + request);
        } else {
            successor.HandlerRequest(request); // 将请求发送给下一位
        }
    }
}

public class ConcreteHandler3 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request > 20 && request <= 50) {
            System.out.println("ConcreteHandler3 处理10到20的请求 request = " + request);
        } else {
            System.out.println("无法处理的请求 request = " + request);
        }
    }
}

public class Test {

    public static void main(String[] args) {

        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
		// 设置责任链的下家
        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        int[] request = {2,4,3,6,20,10,40,3015,19,63,84};

        for (int i : request) {
            handler1.HandlerRequest(i);
        }

    }
}

测试结果

ConcreteHandler1 处理0到10的请求 request = 2
ConcreteHandler1 处理0到10的请求 request = 4
ConcreteHandler1 处理0到10的请求 request = 3
ConcreteHandler1 处理0到10的请求 request = 6
ConcreteHandler2 处理10到20的请求 request = 20
ConcreteHandler1 处理0到10的请求 request = 10
ConcreteHandler2 处理10到20的请求 request = 15
ConcreteHandler3 处理10到20的请求 request = 30
ConcreteHandler3 处理10到20的请求 request = 40
ConcreteHandler2 处理10到20的请求 request = 19
无法处理的请求 request = 63
无法处理的请求 request = 84

你可能感兴趣的:(设计模式)