一:现实场景

有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真实代码如下:

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件))

{

//第三步:动态生成邮件模板

var styleInfo = CacheUtil.GetRandomEmailStyle();

var tuple = new EdmDraftBoxBLL().GetEdmHtmlTitle(communicationInfo.EDMJson, styleInfo.StyleId);

leaflet.Title = tuple.Item1;

leaflet.EDMContent = tuple.Item2;

leaflet.Header = tuple.Item3;

leaflet.SendSMSCount = 1;

}

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.短信))

{

leaflet.SMSContent = communicationInfo.SMSContent;

leaflet.SendSMSCount = communicationInfo.SMSCount;

}

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.彩信))

{

leaflet.MMSContent = communicationInfo.MMSContent;

}

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

模板库中随机抽取一封,给leaflet的title,header...赋值,有些人可能会说这段代码不难看哈,确实是这样,但是如果面对需求变更呢?比如说后期需要增加微信,微博渠道,那是不是又要加上两个if才能把这个问题解决呢? 这就违背了设计模式中开闭原则,对吧,面对这种场景,可以用责任链模式摆平。

二:责任链模式

责任链模式讲的就是将请求的发送者和接收者进行分离,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,面对需求变更,只需要更加处理类就好了,而且客户端可以按照自己的需求拼接处理链条,是不是很强大。

1. AbstractComunication

public abstract class AbstractComunication

{

AbstractComunication abstractComunication = null;

public void SetHandler(AbstractComunication abstractComunication)

{

this.abstractComunication = abstractComunication;

}

public abstract void HanderRequest(LeafletEntity leaflet,

EventmarketingSmsEdmContentInfo communicationInfo);

}

2. MMSComunication

public class MMSComunication : AbstractComunication

{

public override void HanderRequest(LeafletEntity leaflet, EventmarketingSmsEdmContentInfo communicationInfo)

{

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.彩信))

{

leaflet.MMSContent = communicationInfo.MMSContent;

}

else

{

abstractComunication.HanderRequest(leaflet, communicationInfo);

}

}

}

3.EDMComunication

public class EDMComunication : AbstractComunication

{

public override void HanderRequest(LeafletEntity leaflet, EventmarketingSmsEdmContentInfo communicationInfo)

{

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件))

{

//第三步:动态生成邮件模板

var styleInfo = CacheUtil.GetRandomEmailStyle();

var tuple = new EdmDraftBoxBLL().GetEdmHtmlTitle(communicationInfo.EDMJson, styleInfo.StyleId);

leaflet.Title = tuple.Item1;

leaflet.EDMContent = tuple.Item2;

leaflet.Header = tuple.Item3;

leaflet.SendSMSCount = 1;

}

else

{

abstractComunication.HanderRequest(leaflet, communicationInfo);

}

}

}

4.SMSComunication

public class SMSComunication : AbstractComunication

{

public override void HanderRequest(LeafletEntity leaflet, EventmarketingSmsEdmContentInfo communicationInfo)

{

if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.短信))

{

leaflet.SMSContent = communicationInfo.SMSContent;

leaflet.SendSMSCount = communicationInfo.SMSCount;

}

else

{

abstractComunication.HanderRequest(leaflet, communicationInfo);

}

}

}

5.客户端调用

AbstractComunication communication1 = new EDMComunication();

AbstractComunication communication2 = new SMSComunication();

AbstractComunication communication3 = new MMSComunication();

//手工将三个Comunication 凭借成一个链条,形成单链表的模型

communication1.SetHandler(communication2);

communication2.SetHandler(communication3);

communication1.HanderRequest(leaflet, communicationInfo);

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

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

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

其实js的冒泡机制就是这种模式的一个体现。

public abstract class AbstractHandler

{

protected AbstractHandler abstractHandler = null;

public void SetHandler(AbstractHandler abstractHandler)

{

this.abstractHandler = abstractHandler;

}

public virtual void HandleRequest(int request) { }

}

public class ConcreteHandler1 : AbstractHandler

{

public override void HandleRequest(int request)

{

if (request == 1)

{

Console.WriteLine("handler1 给你处理了");

}

else

{

abstractHandler.HandleRequest(request);

}

}

}

public class ConcreteHandler2 : AbstractHandler

{

public override void HandleRequest(int request)

{

if (request == 2)

{

Console.WriteLine("handler2 给你处理了");

}

else

{

abstractHandler.HandleRequest(request);

}

}

}

public class ConcreteHandler3 : AbstractHandler

{

public override void HandleRequest(int request)

{

if (request == 3)

{

Console.WriteLine("handler3 给你处理了");

}

else

{

abstractHandler.HandleRequest(request);

}

}

}

class Program

{

static void Main(string[] args)

{

AbstractHandler hander1 = new ConcreteHandler1();

AbstractHandler hander2 = new ConcreteHandler2();

AbstractHandler hander3 = new ConcreteHandler3();

hander1.SetHandler(hander2);

hander2.SetHandler(hander3);

hander1.HandleRequest(3);

}

}

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

相关文章;

  • 从真实项目中抠出来的设计模式——第一篇:策略模式

  • 从真实项目中抠出来的设计模式——第二篇:过滤器模式

原文地址:http://www.cnblogs.com/huangxincheng/p/6429284.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

  1. 从真实项目中抠出来的设计模式——第二篇:过滤器模式

    一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...

  2. 从真实项目中抠出来的设计模式——第一篇:策略模式

    有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我...所以时间充裕一点之后就想重构一下,毕 ...

  3. 设计模式(三)- 责任链模式

    职责链模式 文章目录 职责链模式 1.职责链模式 1.介绍 2.应用实例 代码 1.员工提交请求类:LeaveRequest 2. 抽象请假处理类:AbstractLeaveHandler 3.直接主 ...

  4. 行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)

    文章目录 1.简介 2.使用场景 3.示例 4.变种 参考文献 1.简介 经常听身边的同事说其在项目中用到了责任链模式,今天就来学习一下什么是责任链模式. 责任链模式(Chain of Respons ...

  5. 设计模式(四)责任链模式——责任链模式结构

    定义 责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链.客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程.而链路中内部的处理,是按照前一个处 ...

  6. Android设计模式详解之责任链模式

    前言 责任链模式是行为型设计模式: 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 使用场景: 多 ...

  7. 设计模式(五)责任链模式

    一.什么是责任链模式?     责任链就是从一个起点发起请求,然后沿着任务链依次传递给每一个节点上的对象,直到有一个节点处理这个请求为止. 二.责任链模式实例实现? 1 public abstract ...

  8. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  9. 重温设计模式(三)——职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

最新文章

  1. Linux常用命令--网终设置
  2. 寒冬之下,做好这六点
  3. SQL Server调优系列进阶篇(如何维护数据库索引)
  4. MATLAB:图像半色调技术简介
  5. Python 开发桌面小工具,让代码替我们干重复的工作!
  6. linux ida 图形界面,linux – IDA在屏幕内不起作用
  7. spring mvc学习(15)Referenced file contains errors
  8. [vagrant]vagrant centos静态ip设置
  9. 2019年2月25日 Range Sum of BST
  10. 机动车辆保费计算器 1.1新版发布
  11. 将rgba图片信息转换为bmp图片文件
  12. 百度文库下载文档,没财富值,没下载卷也能下载
  13. 唯一索引(unique index)的创建和使用
  14. [原创]佰志达SBO网上商城系统业务框架介绍
  15. 外汇EA网格交易策略
  16. 关于蜗牛星际的升级问题!
  17. 如果你对未来还有点迷茫不妨来看一下,必看的软件测试指引!!!
  18. UVa 220 黑白棋 算法竞赛入门经典 习题4-3
  19. oracle 的乘法,Oracle group by 相乘
  20. mybatis(二)xml配置文件详细说明

热门文章

  1. C++的enum hack
  2. getch, getche, getchar 转
  3. 批处理解决局域网共享打印机问题
  4. Linux配置sudo
  5. ASP.NET 應用程式的安全性模型
  6. Avalonia跨平台入门第六篇之Grid动态分割
  7. CSharp 如何OCR离线识别文本
  8. C#-using与添加引用的关系
  9. . NET5一出,. NET岗面试普遍喊难,真相是…
  10. 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)