• java设计模式(十三)——责任链模式


    1、基本概念

    责任链模式采用链表结构,将链中每一个节点看作是一个处理不同请求的对象
    且内部自动维护一-个下一个节点对象。当一个请求从链式的首端发出时,会沿着链的路径
    依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。

    生活中的案例:工作的审批,报备流程,闯关游戏等

    2、类图和角色

    类图:

    主要两个角色:

    抽象处理者:AbstractHandler

    具体处理者:ConcreteAbstractHandlerA,ConcreteAbstractHandlerB,ConcreteAbstractHandlerC

    3、案例

    案例:假如一个项目得到开发报备,项目————》经过项目经理审批————》产品经理审批 ————》财务经理审批

    类图:

     抽象处理者:接口IProjectHandler

    public interface IProjectHandler {
    
        void doHandler(String req);
    }

     抽象处理者:抽象类AbstractProjectHandler 

    public abstract  class AbstractProjectHandler implements  IProjectHandler{
    
        protected IProjectHandler nextHandler;
    
        public void setNextHandler(IProjectHandler handler){
                this.nextHandler = handler;
        }
        public abstract void doHandler(String req);
    
    }

    具体处理者:项目经理审批ProjectManagerHandler 

    public class ProjectManagerHandler extends AbstractProjectHandler {
        @Override
        public void doHandler(String req) {
            System.out.print("项目经理同意,交由产品经理审批 ————》");
            this.nextHandler.doHandler(req);
        }
    }

    具体处理者:产品经理审批ProductManagerHandler 

    public class ProductManagerHandler extends AbstractProjectHandler {
        @Override
        public void doHandler(String req) {
            System.out.print("产品经理同意,交由财务经理审批————》");
            this.nextHandler.doHandler(req);
        }
    }

    具体处理者:财务经理审批FinancialManagerHandler 

    public class FinancialManagerHandler extends AbstractProjectHandler {
        @Override
        public void doHandler(String req) {
            System.out.println("财务经理审批通过");
        }
    }

    dev类:

    public class Dev {
    public void submitProject(){
    ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
    ProductManagerHandler productManagerHandler = new ProductManagerHandler();
    FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler();

    projectManagerHandler.setNextHandler(productManagerHandler);
    productManagerHandler.setNextHandler(financialManagerHandler);
    projectManagerHandler.doHandler("开发云项目");
    }
    }

    测试:

    public class Test {
        public static void main(String[] args) {
            Dev dev = new Dev();
            dev.submitProject();
        }
    }

    测试输出:

    项目经理同意,交由产品经理审批 ————》产品经理同意,交由财务经理审批————》财务经理审批通过

    各自处理各自的任务,这样一个简单得责任链模式就完成了。在上面的dev代码中,我们可以看到在维护下一个节点的过程有些繁琐

    对于这种结构我们可以想到建设者模式java设计模式(四)——建造者模式

    修改抽象类AbstractProjectHandler 的代码,加入一个内部类Builder:

    public abstract  class AbstractProjectHandler implements  IProjectHandler{
    
        protected IProjectHandler nextHandler;
    
        public void setNextHandler(IProjectHandler handler){
                this.nextHandler = handler;
        }
        public abstract void doHandler(String req);
    
        public static class  Builder{
            private AbstractProjectHandler head;
            private AbstractProjectHandler tail;
    
            public Builder addHandler(AbstractProjectHandler handler){
                if(this.head == null){
                    this.head = this.tail = handler;
                }
                this.tail.setNextHandler(handler);
                this.tail = handler;
                return this;
            }
    
            public AbstractProjectHandler build(){
                    return this.head;
            }
    
        }
    }

    dev类修改:

    public class Dev {
        public void submitProject(){
            ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
            ProductManagerHandler productManagerHandler = new ProductManagerHandler();
            FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler();
    
           /* projectManagerHandler.setNextHandler(productManagerHandler);
            productManagerHandler.setNextHandler(financialManagerHandler);
            projectManagerHandler.doHandler("开发云项目");*/
    
    
            AbstractProjectHandler.Builder builder = new AbstractProjectHandler.Builder();
            builder.addHandler(projectManagerHandler).
                    addHandler(productManagerHandler).
                    addHandler(financialManagerHandler);
            builder.build().doHandler("开发云项目");
        }
    }

    我们可以看到这样的结构就会清晰许多。

    4、优缺点

    责任链模式的优点:

    1、请求和处理是解耦的

    2、请求节点可以处理能处理的请求,无法处理的交给下一个节点继续处理

    3、易于扩展节点,符合开闭原则。

  • 相关阅读:
    博客园精华集汇总
    SQLServer中临时表与表变量的区别分析
    【转】InstantClient安装使用
    博客人生
    【Sniffer】如何查看Sniffer截获的数据内容
    Excel使用基础
    书和耳机到了
    MindManager Pro 9.1.157更改默认字体
    xml spy中显示文件路径
    【LR】Error 27191: "web_image_check" failed 报错解决方法
  • 原文地址:https://www.cnblogs.com/tdyang/p/13328182.html
Copyright © 2020-2023  润新知