设计模式之责任链模式简介说明

欣喜 Java教程 发布时间:2024-02-07 09:48:05 阅读数:11370 1
下文笔者讲述责任链模式的简介说明,如下所示

责任链模式简介

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

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

责任链模式中两个角色

责任链模式中两个角色
   1.抽象处理者(Handler):
         定义处理请求的方法
         并维护一个下一处理节点Handler对象的引用
   2.具体处理者(ConcreteHandler):
        对请求进行处理
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<String> list = Arrays.asList("handlerA000", "handlerB111", "handlerC222");
    for (String str : list) {
        handlerA.doHandle(str);
    }
}

3. 其他

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);
        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202402/7933.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者