zoukankan      html  css  js  c++  java
  • 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、易于扩展节点,符合开闭原则。

  • 相关阅读:
    DeepFM
    Wide & Deep Learning Model
    机器学习优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
    svm、logistic regression对比
    梯度下降和EM算法,kmeans的em推导
    牛顿法、拟牛顿法以及与梯度下降法的对比
    【effective c++】构造/析构/赋值运算
    Tips/Tricks in Deep Neural Networks
    GoogLeNet系列解读
    电脑组装的配件及其功能
  • 原文地址:https://www.cnblogs.com/tdyang/p/13328182.html
Copyright © 2011-2022 走看看