设计模式----职责链模式

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

        不知道你有没有写过很复杂的业务逻辑呢?是不是写了无数个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,到这里,我们的职责链就完成了

猜你喜欢

转载自www.cnblogs.com/liuhuimh/p/10964197.html