设计模式----职责链模式
Posted liuhuimh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式----职责链模式相关的知识,希望对你有一定的参考价值。
今天,我们来学习学习职责链模式,职责链模式,从字面上的意思还真的不好理解,我们要拆分来理解下,职责和链,职责不用解释了就是自己需要做的事,那么链呢,何为链,就是锁链嘛!我们都知道锁链一般是由一环一环的圆圈构成的,哎,一环一环,这一环是不是就是我们软件世界中的对象呢?那么连起来的意思就是把职责像链一样一环一环连起来,那么,就构成了我们所说的职责链模式了,那么为什么会有职责链模式呢?这还不是为了解耦嘛,为嘛解耦,不就是为了复用嘛,为嘛复用,还不是为了偷懒嘛,所以,归咎起来,职责链模式就是为了偷懒(哈哈),接下来的时间,就让我们来仔细讲讲如何偷懒。
不知道你有没有写过很复杂的业务逻辑呢?是不是写了无数个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,到这里,我们的职责链就完成了
以上是关于设计模式----职责链模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式 行为型模式 -- 职责链模式(JDK源码分析:FilterChain(过滤器))