再谈事件封装性

上篇总结了使用事件来使委托得到更好的封装性,还能限制含有事件的类型的能力,总觉得理解的不够好,索性又看了看别的资料,再做一个例子,好好理解一下事件如何获得更好的封装性


事件在类中声明且生成,且通过使用同一个类或其他类中的委托与时间处理程序关联。包含时间的类用于发布事件。被称为发布器publisher类。其他接受该事件的类被称为订阅器subscriber类。事件使用发布-订阅(publisher-subscriber)模型


更好的封装性体现在:事件应该由发布者触发,而不应该由事件的客户端来触发

DEMO

这里写图片描述

public delegate void NumberChangedEventHandler(int count);
    //定义事件发布者
    public class Publishser
    {
        private int count;
        public NumberChangedEventHandler NumberChanged;//声明一个委托变量
        //public event NumberChangedEventHandler NumberChanged;//声明一个事件

        public void DoSomething() 
        {
            //完成一些工作
            if (NumberChanged != null) {
                count++;
                NumberChanged(count);
            }
        }
    }
 public class Subscriber
    {
        public void OnNumberChanged(int count) 
        {
            Console.WriteLine("Subscriber notified:count={0}", count);
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Publishser pub = new Publishser();
            Subscriber sub = new Subscriber();

            pub.NumberChanged += new NumberChangedEventHandler(sub.OnNumberChanged);
            pub.DoSomething();//应该通过DoSomething来触发事件
            pub.NumberChanged(100);//也可以直接调用,对委托变量的不恰当使用

        }
    }


这时候我们在客户端是可以直接使用发布者类中的委托变量来触发事件的也就是直接调用pub.NumberChanged(100),但是其实这是不恰当的用法,这将会影响到所有注册了该委托的订阅者。我们应该使用publisher类中的doSomething去触发。

我们再看看使用了event之后会是什么效果


这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值