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,到这里,我们的职责链就完成了

  • 相关阅读:
    OnEraseBkgnd、OnPaint与画面重绘
    .编译ADO类DLL时报错的解决方案
    VC列表框样式
    Codeforces 131D. Subway 寻找环树的最短路径
    Codeforces 103B. Cthulhu 寻找奈亚子
    Codeforces 246D. Colorful Graph
    Codeforces 278C. Learning Languages 图的遍历
    Codeforces 217A. Ice Skating 搜索
    Codeforces 107A. Dorm Water Supply 搜图
    Codeforces 263 D. Cycle in Graph 环
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10964197.html
Copyright © 2011-2022 走看看