事件的好处~实现对修改的封闭,对扩展的开放

简介:

事件是这样的,我觉得用事件来做这事比较好,它很好的遵循了“开闭原则”,当然这并不是最重要的,最重要的应该是它更符合程序开发的原则。

场合:一个订单处理问题,一个订单的产生可能由多种途径生成,A产品走A产品的订单处理过程,完成后显示A产品的订单成功页,B产品走B产品的购买流程,完成后,显示B产品听订单成功页,当然陆续可能会有C产品,D产品等等

实现:不考虑订单处理业务,只考虑订单成功页的显示

解决1:由A产品页向订单统一处理程序传递参数,在订单统一处理程序里去判断参数,然后显示信息

解决2:A产品订阅一个事件,去返回订单成功后显示的页面,在订单统一处理程序里触发这个事件,然后自己显示指定信息

从上面两解决解决方法中,可以看到“方法2”更加灵活,更符合面向对象的原则,“原则”不是说说而以的,它确实有它的意思,有它的好处,当有C产品,D产品出现时,只需要修改C和D对应的部门就可以了,而“单统一处理程序”不需要做修改,而“方法1”则需要修改“单统一处理程序”,这样做下去会使你的程序的维护性和扩展性大打折扣。

代码如下:

/// <summary> 
    /// 返回一条特定的消息 
    /// </summary> 
    public class ReturnMessage 
    { 
        #region Events 
        /// <summary> 
        /// 重定向事件 
        /// </summary> 
        public static event ReturnMsgEventHandler ReturnMsg; 
        #endregion

        #region OnEvents Methods 
        /// <summary> 
        /// 触发重定向事件 
        /// </summary> 
        public static string OnReturnMsg() 
        { 
            if ((ReturnMsg != null)) 
            { 
                return ReturnMsg(); 
            } 
            else 
                return "查看已买到的课程"; 
        } 
        #endregion

    } 
    #region Delegates 
    /// <summary> 
    /// 返回一个字符串消息的委托 
    /// </summary> 
    public delegate string ReturnMsgEventHandler(); 
    #endregion

在主程序中触发时可以这样:

ViewData["Msg"] = ReturnMessage.OnReturnMsg();

在订阅时可以这样:

ReturnMessage.ReturnMsg += new ReturnMsgEventHandler(ReturnMsg_ReturnMsg);

string ReturnMsg_ReturnMsg() 
     { 
         return "产品C成功"; 
     }

也可以使用匿名方法,写在一行:

ReturnMessage.ReturnMsg +=  delegate(){return "产品C成功";};

本文转自博客园张占岭(仓储大叔)的博客,原文链接:事件的好处~实现对修改的封闭,对扩展的开放,如需转载请自行联系原博主。

目录
相关文章
|
9月前
|
uml
开闭原则(对修改封闭,对扩展开放)
开闭原则(对修改封闭,对扩展开放)
94 0
|
7月前
|
容器
通用研发提效问题之区分女娲上下文中的共享字典和隔离字典,如何解决
通用研发提效问题之区分女娲上下文中的共享字典和隔离字典,如何解决
|
9月前
|
移动开发 小程序 API
【产品上新】openURL接口开放,实现在小程序与H5之间“反复横跳”
【产品上新】openURL接口开放,实现在小程序与H5之间“反复横跳”
141 1
|
监控 安全 网络架构
用于同步光网络 (SONET) 和同步数字体系 (SDH) 控制的通用多协议标签交换 (GMPLS) 扩展
本文档提供了特定于同步光网络 (SONET)/同步数字体系结构 (SDH) 的详细信息。根据 [RFC3471],SONET/SDH 特定参数在信令协议中携带在流量参数特定对象中。
529 0
|
Linux
单一版本
单一版本
106 0
301转向有哪些用途?
除了解决网址规范化问题,还有很多需要做301转向的情形。比如,为保护版权,<a href="https://www.fgba.net/" target="_blank">富贵论坛</a>www.fgba.net拥有不同TLD的多个域名: ▪fgba.cn ▪fgba.cc ▪fgba.co
149 0
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
660 0