设计模式之责任链模式

责任链模式

  • 责任链模式(Chain of Responsibility Pattern)
  • 责任链模式将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。
  • 当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止

优点:职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

1.2 两个角色

(1)抽象处理者(Handler):定义处理请求的方法,并维护一个下一处理节点Handler对象的引用
(2)具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发

2. 示例

用户的请求传递,直到可以解决这个请求为止

image.png
public abstract class AbstractHandler {

    protected AbstractHandler successor;
    /**
     * 设置继任者
     */
    public void setSuccessor(AbstractHandler successor) {
        this.successor = successor;
    }

    protected abstract void doHandle(String request);
}
public class ConcreteHandlerA extends AbstractHandler {
    @Override
    protected void doHandle(String request) {
        if (request.startsWith("handlerA")) {
            System.out.println("ConcreteHandlerA execute: " + request);
        } else {
            // 请求向下传递
            successor.doHandle(request);
        }
    }
}

public class ConcreteHandlerB extends AbstractHandler {
    @Override
    public void doHandle(String request) {
        if (request.startsWith("handlerB")) {
            System.out.println("ConcreteHandlerB execute: " + request);
        } else {
            successor.doHandle(request);
        }
    }
}

public class ConcreteHandlerC extends AbstractHandler {
    @Override
    protected void doHandle(String request) {
        if (request.startsWith("handlerC")) {
            System.out.println("ConcreteHandlerC execute: " + request);
        } else {
            successor.doHandle(request);
        }
    }
}

测试:

@Test
public void test() {
    AbstractHandler handlerA = new ConcreteHandlerA();
    AbstractHandler handlerB = new ConcreteHandlerB();
    AbstractHandler handlerC = new ConcreteHandlerC();
    handlerA.setSuccessor(handlerB);
    handlerB.setSuccessor(handlerC);

    List list = Arrays.asList("handlerA000", "handlerB111", "handlerC222");
    for (String str : list) {
        handlerA.doHandle(str);
    }
}
``
## 3. 其他
```java
public abstract class AbstractHandle {

    public static void main(String[] args) {
        AbstractHandle handle = Builder.create()
                .addHandler(new ValidateHandle())
                .addHandler(new LoginHandle())
                .addHandler(new AuthHandle())
                .build();
        handle.doHandle("111");
    }

    protected AbstractHandle chain;

    public void next(AbstractHandle handle) {
        this.chain = handle;
    }

    /**
     * 抽象方法
     * @param request
     */
    public abstract void doHandle(String request);

    public static class Builder {
        private AbstractHandle head;
        private AbstractHandle tail;

        public Builder addHandler(AbstractHandle handle) {
            if (this.head == null) {
                this.head = this.tail = handle;
                return this;
            }
            this.tail.next(handle);
            this.tail = handle;
            return this;
        }

        public AbstractHandle build() {
            return this.head;
        }

        public static Builder create() {
            return new Builder();
        }
    }
}

class ValidateHandle extends AbstractHandle {
    @Override
    public void doHandle(String request) {
        System.out.println("ValidateHandle start");
        if (chain != null) {
            chain.doHandle(request);
        }
    }
}

class LoginHandle extends AbstractHandle {
    @Override
    public void doHandle(String request) {
        System.out.println("LoginHandle start");
        if (chain != null) {
            chain.doHandle(request);
        }
    }
}

class AuthHandle extends AbstractHandle {
    @Override
    public void doHandle(String request) {
        System.out.println("AuthHandle start");
        // 若还有下一级,请求继续传递
        if (chain != null) {
            chain.doHandle(request);
        }
    }
}
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/12442,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?