zoukankan      html  css  js  c++  java
  • 设计模式----职责链模式

            今天,我们来学习学习职责链模式,职责链模式,从字面上的意思还真的不好理解,我们要拆分来理解下,职责和链,职责不用解释了就是自己需要做的事,那么链呢,何为链,就是锁链嘛!我们都知道锁链一般是由一环一环的圆圈构成的,哎,一环一环,这一环是不是就是我们软件世界中的对象呢?那么连起来的意思就是把职责像链一样一环一环连起来,那么,就构成了我们所说的职责链模式了,那么为什么会有职责链模式呢?这还不是为了解耦嘛,为嘛解耦,不就是为了复用嘛,为嘛复用,还不是为了偷懒嘛,所以,归咎起来,职责链模式就是为了偷懒(哈哈),接下来的时间,就让我们来仔细讲讲如何偷懒。

            不知道你有没有写过很复杂的业务逻辑呢?是不是写了无数个if和else再加无数个if和else呢?,虽然最后酣畅淋漓的写出来之后有一种特别畅快的感觉,但是,一测试,你会发现,你的逻辑错到家了,然后再回过头来看自己写的代码,卧槽,这写的啥,层层嵌套的if  else 看的人头皮发麻,今天,我们的职责链虽然不是完全解决这种问题的方案,但是,职责链能教给我们一种抽离判断的思路。好,废话不多说,我们进入今天的正题,职责链,我们应该抽象什么呢?职责??组成链的圆圈,不,这些都不够,我们应该抽象一个担任职责的对象来,请看代码

    abstract class Handler
        {
            protected Handler sueecssor;
            public void SetSuccerssor(Handler sueecssor)
            {
                this.sueecssor = sueecssor;
            }
            public abstract void HandleRequest(int request);
        }

    Handler类就是我们今天所要的担任职责的抽象对象,首先我们看到它的内部定义了一个类型为自己的sueecssor属性,注意,这个属性不是私有的,这样的目的是为了什么呢?其实就是为了构成我们的链,这个属性就是我们职责的链接,具体怎么链接,我们看下面的代码

     class ConcreteHandler1 : Handler
        {
            public override void HandleRequest(int request)
            {
                if (request >= 0 && request < 10)
                {
                    Console.WriteLine("{0} 处理请求{1}",
                    this.GetType().Name, request);
                }
                else if (sueecssor != null) sueecssor.HandleRequest(request);
    
            }
        }

            这个ConcreteHandler1类,我们实现了Handler抽象类,重写了抽象类中的Handlerequest方法,我们仔细看方法内部,如果传入的参数不满足条件的话,那么控制权就教给我们下一个处理者,怎么交,就是通过我们刚刚抽象类中的sueecssor属性,可能还是不太好理解,这样,我们通过客户端调用来理解

    class Program
        {
            static void Main(string[] args)
            {
                ConcreteHandler1 concrete0 = new ConcreteHandler1();
                ConcreteHandler1 concrete1 = new ConcreteHandler1();
                ConcreteHandler1 concrete2 = new ConcreteHandler1();
                concrete0.HandleRequest(9);
                concrete0.SetSuccerssor(concrete1);
                concrete1.SetSuccerssor(concrete2);
                Console.Read();
            }
        }

           我们用ConcreteHandler1类声明了三个实例,分别是concrete0、concrete1、concrete2,首先,我们先用0职责类来判断,然后添加concrete1来判断,再接着添加concrete2来判断,这样是不是就像链条一样一环扣一环呢?接着我们来说说为什么实例化的子类可以调用父类的方法呢?首先,我们在实例化ConcreteHandler1类的时候,由于它是继承自Handler类的,所以首先会去创建Handle抽象类,然后才能创建子类,所以这就是为什么子类能用父类中方法的原因,所以,之前声明的sueecssor属性就是为了只让其能在子类中调用才声明为protected,到这里,我们的职责链就完成了

  • 相关阅读:
    深度学习模型参数计算
    keras多输出多输出示例(keras教程一)
    keras可视化报错:OSError: `pydot` failed to call GraphViz.Please install GraphViz问题解决
    git版本管理,git tag
    python封装自己的模块,pip install安装到python环境
    如何理解Virtual DOM
    使用 Hbuilder 连接手机调试移动端项目
    js 常用排序
    博客漂浮的小人
    开发者必备Linux命令
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10964197.html
Copyright © 2011-2022 走看看