加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从真实项目中抠出来的设计模式——第三篇:责任链模式

发布时间:2020-12-13 20:55:09 所属栏目:百科 来源:网络整理
导读:? ? 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给 实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真

? ? 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给

实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真实代码如下:

styleInfo = tuple = leaflet.Title = leaflet.EDMContent = leaflet.Header = leaflet.SendSMSCount = leaflet.SMSContent = leaflet.SendSMSCount = leaflet.MMSContent = }

? ? ? ?上面的代码还是非常简单明了的,程序会根据leaflet.CommunicationtypeEnum的不同做不同的判断,比如说当前状态是邮件的话,程序会从30套邮件

模板库中随机抽取一封,给leaflet的title,header...赋值,有些人可能会说这段代码不难看哈,确实是这样,但是如果面对需求变更呢?比如说后期需要增加微

信,微博渠道,那是不是又要加上两个if才能把这个问题解决呢? 这就违背了设计模式中开闭原则,对吧,面对这种场景,可以用责任链模式摆平。

? ? ?责任链模式讲的就是将请求的发送者和接收者进行分离,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,

并且沿着这条链传递请求,直到有对象处理它为止,面对需求变更,只需要更加处理类就好了,而且客户端可以按照自己的需求拼接处理链条,是不是很强大。

1.?AbstractComunication

= </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; SetHandler(AbstractComunication abstractComunication) { </span><span style="color: #0000ff;"&gt;this</span>.abstractComunication =<span style="color: #000000;"&gt; abstractComunication; } </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;abstract</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; HanderRequest(LeafletEntity leaflet,EventmarketingSmsEdmContentInfo communicationInfo); }</span></pre>

2.?MMSComunication

leaflet.MMSContent = }

3.EDMComunication

styleInfo = tuple = leaflet.Title = leaflet.EDMContent = leaflet.Header = leaflet.SendSMSCount = }

4.SMSComunication

leaflet.SMSContent = leaflet.SendSMSCount = }

5.客户端调用

AbstractComunication communication1 = AbstractComunication communication2 = AbstractComunication communication3 = communication1.HanderRequest(leaflet,communicationInfo);

其实上面的代码,需要绕一下脑子的就是如何通过SetHandler将三个xxxComunication拼接成一个单链表的形式,链表怎么拼接在于客户端如何设置sethandler,

灵活性完全就在客户端这边,然后就非常方便将leaflet在责任链中游走,最终会被某一状态处理逻辑处理,讲到这里,我想大家应该都知道责任链模式是干嘛的了,

由于是真实案例就不方便跑代码了,下面我构建一个责任链模型,大家比照一下就可以了,是不是有种请求和处理的分离,而且我还可以根据需要组合我的责任链,

其实就是这种模式的一个体现。

AbstractHandler abstractHandler = </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; SetHandler(AbstractHandler abstractHandler) { </span><span style="color: #0000ff;"&gt;this</span>.abstractHandler =<span style="color: #000000;"&gt; abstractHandler; } </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;virtual</span> <span style="color: #0000ff;"&gt;void</span> HandleRequest(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; request) { } }

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ConcreteHandler1 : AbstractHandler
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">override <span style="color: #0000ff;">void HandleRequest(<span style="color: #0000ff;">int<span style="color: #000000;"> request)
{
<span style="color: #0000ff;">if (request == <span style="color: #800080;">1<span style="color: #000000;">)
{
Console.WriteLine(<span style="color: #800000;">"<span style="color: #800000;">handler1 给你处理了<span style="color: #800000;">"<span style="color: #000000;">);
}
<span style="color: #0000ff;">else<span style="color: #000000;">
{
abstractHandler.HandleRequest(request);
}
}
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; ConcreteHandler2 : AbstractHandler
{
    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;override</span> <span style="color: #0000ff;"&gt;void</span> HandleRequest(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; request)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (request == <span style="color: #800080;"&gt;2</span><span style="color: #000000;"&gt;)
        {
            Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;handler2 给你处理了</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
        }
        </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
        {
            abstractHandler.HandleRequest(request);
        }
    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; ConcreteHandler3 : AbstractHandler
{
    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;override</span> <span style="color: #0000ff;"&gt;void</span> HandleRequest(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; request)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (request == <span style="color: #800080;"&gt;3</span><span style="color: #000000;"&gt;)
        {
            Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;handler3 给你处理了</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
        }
        </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
        {
            abstractHandler.HandleRequest(request);
        }
    }
}

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Program
{
    </span><span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> Main(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;[] args)
    {
        AbstractHandler hander1 </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ConcreteHandler1();
        AbstractHandler hander2 </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ConcreteHandler2();
        AbstractHandler hander3 </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ConcreteHandler3();

        hander1.SetHandler(hander2);
        hander2.SetHandler(hander3);

        hander1.HandleRequest(</span><span style="color: #800080;"&gt;3</span><span style="color: #000000;"&gt;);
    }
}</span></pre>

好了,模板和实际项目的案例都给大家展示了,希望能帮助到你。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读