首页 > 其他分享 >当模板方法遇到了委托函数,你的代码又可以精简了

当模板方法遇到了委托函数,你的代码又可以精简了

时间:2023-04-18 12:36:05浏览次数:41  
标签:return string 代码 ProcessRequest 彩信 override 精简 public 模板

现如今当你翻看一些开源项目源码的时候,你会发现现在到处充斥着委托函数,如Func,Action,Predicate,确实现在的C#在函数式编程 的路上越来越成为主流,越来越显示威力,曾经的一些经典设计模式写法,在函数式下可以稍微优化一下了,这篇我们就来说说模板方法。

一:实际场景

1. 模板方法定义

相信这个模式在平时开发中会经常使用到,定义也很简单,在父类中定义算法骨架,骨架里面的某些细节点由相应的子类实现。

2. 业务场景

给用户推送彩信的时候,公司需要对接很多的彩信服务商,比如说博士通,助通,联合维拓,而每一家对提交彩信的格式有不同的要求, 比如说:博士通和助通会要求所有的内容按指定格式进行base64编码提交过去,联合维拓会要求你按指定格式打包成一个zip文件流过去, 这就是一个经典的模板模式,可以在父类中定义好构造彩信的算法骨架,具体细节可以由各自厂家子类实现,为了方便演示画图如下:

当模板方法遇到了委托函数,你的代码又可以精简了_子类

源码如下:

    class MmsTemplate
    {
        public virtual string GetHeader() { return string.Empty; }
        public virtual string GetBody() { return string.Empty; }
        public virtual string GetTail() { return string.Empty; }

        public virtual void ProcessRequest()
        {
            Console.WriteLine($"1. 彩信头:{GetHeader()}");
            Console.WriteLine($"2. 彩信体:{GetBody()}");
            Console.WriteLine($"3. 彩信尾:{GetTail()}");
        }
    }

    class ZhutongTemplate : MmsTemplate
    {
        public override string GetHeader() { return "我是助通头!"; }

        public override string GetTail() { return "我是助通体!"; }

        public override string GetBody() { return "我是助通尾!"; }

        public override void ProcessRequest() { base.ProcessRequest(); }
    }

    class LianheweituoTemplate : MmsTemplate
    {
        public override string GetHeader() { return "我是联合维拓头!"; }

        public override string GetTail() { return "我是联合维拓体!"; }

        public override string GetBody() { return "我是联合维拓尾!"; }

        public override void ProcessRequest() { base.ProcessRequest(); }
    }

然后客户端可以根据指定通道配置调用相应的子类实现不同厂家的彩信体构建。

当模板方法遇到了委托函数,你的代码又可以精简了_多态_02

二:委托函数

1. 反思

在面向对象编程语言中,这种写法都堪称标准,我们先来捋一下流程,子类入口 -> 执行父类方法 -> 调用子类方法 如下图

当模板方法遇到了委托函数,你的代码又可以精简了_子类_03

从上图中可以发现一个问题,父类在执行算法骨架的时候,为了能够再次执行到该子类方法,在面向对象编程中必须要使用的技术就是多态,而为了构造多态,就必须在父类中定义一堆方法,然后由子类实现这一堆方法,这就是你看到的GetHeader(),GetTail(),GetBody()的由来,这时就显得有点老态龙钟。

2. 回调函数

仔细看一下这个xmind图,ZhutongTemplate类调用的MmsTemplate的方法,MmsTemplate在执行的时候再调用ZhutongTemplate的方法,前者叫调用,后者叫回调,如果还不明白,那前者叫送礼,后者叫回礼。。。 对,既然在以前是用多态制造回调,那我是不是可以直接使用C#中的委托函数更简单粗暴呢?

3. 改造模板

直接看代码吧,千言难抵上代码。


    class MmsTemplate
    {
        protected Func<string> header;
        protected Func<string> body;
        protected Func<string> tail;

        public virtual void ProcessRequest()
        {
            Console.WriteLine($"1. 彩信头:{header()}");
            Console.WriteLine($"2. 彩信体:{header()}");
            Console.WriteLine($"3. 彩信尾:{tail()}");
        }
    }

    class ZhutongTemplate : MmsTemplate
    {
        public override void ProcessRequest()
        {
            this.header = () => "我是助通头!";
            this.body = () => "我是助通体";
            this.tail = () => "我是助通尾!";

            base.ProcessRequest();
        }
    }

    class LianheweituoTemplate : MmsTemplate
    {
        public override void ProcessRequest()
        {
            this.header = () => "我是联合维拓头!";
            this.body = () => "我是联合维拓体";
            this.tail = () => "我是联合维拓尾!";

            base.ProcessRequest();
        }
    }

从上面代码中可以看到,原来需要多态实现的地方直接由委托变量接管,看起来是不是比之前的多态版简洁了很多。

好了,本篇就说到这里,更多的变通玩法期待您的发现~

标签:return,string,代码,ProcessRequest,彩信,override,精简,public,模板
From: https://blog.51cto.com/u_15353947/6202807

相关文章

  • 若依前后端分离 代码生成修改(2)
    修改若依代码生成模块目标:多级目录情况下实现模块名/mvc名[controller/…]/功能名/XXXController原格式:多级目录:模块名/功能名/mvc名[controller/…]/xxxController修改共分为两部分:文件路径和模板代码中的引用路径若依代码生成配置1.修改生成文件路径Com......
  • ChatGPT/大模型+零代码,给中小企业带来哪些机会?
    ChatGPT让2023年成了AI之年。正如iPhone在2007年开启了智能手机时代,我们现在正在进入人工智能时代。新形势下,零代码应如何借势发力?伙伴云“AI+零代码”给出了答案。作为零代码领域的头部平台,伙伴云全量发布【AI零代码应用搭建平台】,无需用户单独训练,无需额外投资,根据用户具体需求、......
  • 【敲敲云】零代码实战,主子表汇总统计—免费的零代码产品
    近来很多朋友在使用敲敲云时,不清楚如何使用主子表,及如何在主表中统计子表数据;下面我们就以《订单》表及《订单明细》表来设计一下吧,用到的组件有“设计子表”、“公式”、“汇总”等。《订单》表展示总金额=订单明细中“小计”求和小计=单价*数量首选我们打开敲敲云......
  • 洛谷P5494 【模板】线段树分裂
    传送门  需要的前置知识:线段树合并。  感觉会了线段树合并这个就很简单,线段树分裂就是在把一颗权值线段树值域在[x,y]的区间分裂出来单独成一个线段树,那么我们只需要从新树q和旧树p的根节点一起走,如果走到当前p被[x,y]完全包含的路径就把p的编号给q,并且把p改为0就行了,注意......
  • 面对CICD分析的代码静态测试工具Klocwork 2023.1版本更新快讯
    前言  Klocwork2023.1为CI/CD分析pipeline引入灵活的管理选项。使用差异分析加速静态分析扫描,在CI/CD管道构建中提供上下文结果,并可以用和服务器端相同的方式管理issue。 扩展了对Java14/15和C#8.0语言的支持,C/C++/C#PATH分析性能提升高达50%*。此外,此版本还包括对M......
  • 【Git代码仓库托管】上海道宁为您提供构建、扩展和交付安全软件的完整开发人员平台
      GitHub是用于构建、扩展和交付安全软件的完整开发人员平台通过提高开发人员速度的工具推动创新加快高质量软件开发  GitHub提供无限的存储库一流的版本控制和世界上强大的开源社区因此您的团队可以更高效地协同工作  开......
  • 低代码开发重要工具:私有化部署的jvs-logic的设计与价值
    逻辑引擎介绍逻辑引擎是一种能够处理逻辑表达式的程序,它能够根据用户输入的表达式计算出表达式的值。在实际应用中,逻辑引擎通常被用于处理规则引擎、决策系统、业务规则配置等领域,具有广泛的应用前景。逻辑引擎如下图所示,在业务系统中存在各种的业务触发的动作,例如提交一个申请、回......
  • 如何查看Oracle加密代码
    例如我们想看看dbms_pdb.cleanup_task这个函数的内容是什么,直接看会发现只能看到声明,代码是加密的可以把加密后的代码粘出来解密https://www.codecrete.net/UnwrapIt/解密后找到cleanup_task对应部分查了下PRAGMAINTERFACE(C,KPDBCLEANUPTASK);意思是调用C语言的内部代码,更深一层......
  • GPIO初始化,及中断代码演示
    1#defineLED2572#defineLED1563#defineKEY2554#defineKEY15456#defineGPIO_DEVICE_IDXPAR_XGPIOPS_0_DEVICE_ID7XGpioPsGpio;89voidGpio_Init(void){10XGpioPs_Config*ConfigPtr;1112......
  • UNIX环境高级编程 第三版 源代码编译及使用
    UNIX环境高级编程(第3版)中的代码示例多次包含了一下头文件:#include"apue.h"搜索发现原来这个头文件是作者自定义的一个文件,并在官网提供了源代码供下载。下载之后解压该文件:tar-zxfsrc.3e.tar.gz进入文件夹并编译:cdapue.3emake等待结束,如果没有报错就成功了。(如......