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

一:现实场景

    有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark之Master主备切换机制原理

Spark之Master主备切换机制原理

SQL正在击败NoSQL,这对未来的数据意味着什么

转载自 SQL正在击败NoSQL,这对未来的数据意味着什么 经过多年的沉寂之后,今天的SQL正在复出。缘由如何? 这对数据社区有什么影响? 自从可以利用计算机做事以来,我们一直在收集的数据以指数级的速度在增长&#xff0…

公共计算机课程思政建设实施方案,公共计算机教研组开设课程思政公开课

为了进一步奠定课程思政基础,提高教师将思政元素融入到专业课程的能力,创造一个课程思政的良好氛围,2021年4月30日上午,公共计算机教研组陈雪云老师在文虎楼401教室开设《计算机文化基础(理)》思政课程公开课。授课班级是2020级数学师范1、2班。李美莲、黄婷、龚长斌…

数字奇数和偶数的判断

package lanqiao;/*** 创建人 wdl* 创建时间 2021/4/16* 描述*/ public class TEST {public static void main(String[] args) {int a7,b8;if((a&1)1){System.out.println("a是奇数");}if((b&1)0){System.out.println("b是偶数");}}}

asp.net core源码飘香:从Hosting开始

知识点: 1.Kestrel服务器启动并处理Http请求的过程。 2.Startup的作用。 源码飘香: 总结: asp.net core将web开发拆分为多个独立的组件,大多以http中间件的形式添加到请求管线,也有一下作为基础组件(con…

这些Spring中的设计模式,你都知道吗?

转载自 这些Spring中的设计模式,你都知道吗? 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面&a…

如何移植.NET Framework项目至.NET Core?

公司的项目一直采用.NET框架来开发Web项目。目前基础类库均为.NET Framework 4.6.2版本。Caching, Logging,DependencyInjection,Configuration等基础设施相关的依赖库一直和官方保持同步,目前是1.1版本。.NET Core越来越趋于稳定&#xff0c…

2016蓝桥杯省赛---java---A---8(取球博弈)

题目描述 思路分析 dfs 代码实现 package lanqiao;import java.util.Arrays; import java.util.Scanner;public class Main {public static int []n;public static void main(String[] args) {Scanner scanner new Scanner(System.in);nnew int[3];for (int i 0; i < 3…

分布式统一配置平台-Disconf.Net

为了更好的解决分布式环境下多台服务实例的配置统一管理问题&#xff0c;本文提出了一套完整的分布式配置管理解决方案。结合.net项目具体情况&#xff0c;实现了配置发布的统一化&#xff0c;对配置进行持久化管理并对外提供restful接口&#xff0c;在此基础上&#xff0c;基于…

计算机软件录音注意事项,GOLDWAVE录音软件使用教程

很多朋友都有录音软件&#xff0c;但是软件功能不全&#xff0c;也不是专业的&#xff0c;所以现在我讲一个专业的软件&#xff0c;这个软件都是原创歌手比较常用的软件&#xff0c;现在我们来学习一下。这是该软件的界面&#xff0c;软件的名字叫做GOLDWAVE这款软件的功能很强…

2016蓝桥杯省赛---java---A---10(压缩转换)

题目描述 小明最近在研究压缩算法。 他知道&#xff0c;压缩的时候如果能够使得数值很小&#xff0c;就能通过熵编码得到较高的压缩比。 然而&#xff0c;要使数值很小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数的序列&#xff0c;这些序列的特点是&#xff0c;后面…

量子计算机对人类长寿,科学家称“极端长寿”在未来几十年可能会达到新的里程碑...

原标题&#xff1a;科学家称“极端长寿”在未来几十年可能会达到新的里程碑 来源&#xff1a;cnBeta.COM据外媒报道&#xff0c;人们的平均寿命越来越长&#xff0c;而经历“极端长寿”的人的数量也同样在增加。尽管大多数人活不到100岁&#xff0c;但数据显示&#xff0c;在过…

.NET Framework 4.7发布,支持Windows 10创作者更新

微软刚刚发布了 .NET Framework 4.7&#xff0c;主要是带来了对 Windows 10 “创作者更新” 的支持&#xff0c;开发者们可以通过 Visual Studio 2017 进行最新版 .NET Framework 项目的开发。 .NET Framework 4.7 包含了以下几大改进&#xff1a; 加入对 Windows 10 表格应用…

2016蓝桥杯省赛---java---C---10(密码脱落)

题目描述 思路分析 将字符串反转&#xff0c;后寻找到最长子串&#xff0c;然后用字符串长度减去最长字串长度即可。 代码实现 package lanqiao;import java.util.Scanner;public class Main {static int min0,num0;static String str;public static void main(String[] arg…

使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

原文地址&#xff1a;http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许多不同的方式查询数据&#xff0c;甚至是从未预料到的方式&#xff1f;想要以多种方式可视化日志&#xff1f;同时支持基于时间、文本和其他类…

计算机辐射对人体影响吗,电脑屏幕辐射对人体的危害怎么解决?

现在不光是从事IT职业的人经常用电脑&#xff0c;普通打工族也时常接触电脑&#xff0c;人们用电脑的时间越来越多&#xff0c;电脑屏幕带来的辐射问题随之而来&#xff0c;工作上班用电脑&#xff0c;下班回家看电视剧、打游戏也用电脑&#xff0c;KTV点歌也用触摸屏辐射&…

2017蓝桥杯省赛---java---A---4(方格分割)

题目描述 思路分析 dfs 题目要求沿着格子的边线剪成两个部分&#xff0c;仔细观察&#xff0c;剪开的边线是关于中心点&#xff08;3&#xff0c;3&#xff09;对称的&#xff0c;于是我们从&#xff08;3&#xff0c;3&#xff09;开始搜索&#xff0c;直到搜到边界则退出。…

这些分布式事务的解决方案,你都知道吗

转载自 这些分布式事务的解决方案&#xff0c;你都知道吗 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c;特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 数据库事务 在说分布式事务之前&#x…

如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas

前言 软件系统中总是希望做到松耦合&#xff0c;项目的组织形式也是一样&#xff0c;本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离&#xff0c;并且对Areas进行支持。 实践 1.新建项目 新建两个ASP.NET Core Web应用程序&#xff0c;一个命名…

2017蓝桥杯省赛---java---B---10(k倍区间)

题目描述 标题&#xff1a; k倍区间给定一个长度为N的数列&#xff0c;A1, A2, … AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, … Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。你能求出数列中总共有多少个K倍区间吗&#xff1f;输入 第一行…