弱事件管理器及WeakEventManager,IWeakEventListener的使用

简介:

CarDealer类发布事件,Consumer类(实现IWeakEventListener接口)订阅事件

实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows;

namespace ConsoleDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            CarDealer dealer = new CarDealer("Obama");
            Consumer Jack = new Consumer("Jack");
            WeakCarInfoEventManager.AddListener(dealer, Jack);
            dealer.NewCar("BMW");

            Consumer Bidden = new Consumer("Bidden");
            WeakCarInfoEventManager.AddListener(dealer, Bidden);
            dealer.NewCar("EAGLE");
        }
    }

    public class CarInfoEventArgs : EventArgs
    {
        public CarInfoEventArgs(string name)
        {
            this.Car = name;
        }

        public string Car { get; private set; }
    }

    public class CarDealer
    {
        private string name;
        public CarDealer(string name)
        {
            this.name = name;
        }

        public event EventHandler<CarInfoEventArgs> NewCarInfo;
        public void NewCar(string car)
        {
            Console.WriteLine("{0}, New Car: {1}", name, car);
            NewCarInfo(this, new CarInfoEventArgs(car));
        }
    }

    public class Consumer : IWeakEventListener
    {
        private string name;
        public Consumer(string name)
        {
            this.name = name;
        }

        private void NewCarIsHere(object sender, CarInfoEventArgs e)
        {
            Console.WriteLine("{0}, new car :{0} is here............", name, e.Car);
        }

        bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object source, EventArgs e)
        {
            NewCarIsHere(source, e as CarInfoEventArgs);
            return true;
        }
    }

    public class WeakCarInfoEventManager : WeakEventManager
    {
        public static void AddListener(object source,IWeakEventListener e)
        {
            CurrentManager.ProtectedAddListener(source, e);
        }

        public static void RemoveListener(object source, IWeakEventListener e)
        {
            CurrentManager.ProtectedRemoveListener(source, e);
        }

        public static WeakCarInfoEventManager CurrentManager
        {
            get
            {
                WeakCarInfoEventManager manager = GetCurrentManager(typeof(WeakCarInfoEventManager)) 
                    as WeakCarInfoEventManager;
                if(manager ==null)
                {
                    manager = new WeakCarInfoEventManager();
                    SetCurrentManager(typeof(WeakCarInfoEventManager), manager);
                }

                return manager;
            }
        }

        protected override void StartListening(object source)
        {
            (source as CarDealer).NewCarInfo += CarDealer_NewCarInfo;
        }

        public void CarDealer_NewCarInfo(object sender, CarInfoEventArgs e)
        {
            DeliverEvent(sender, e);
        }

        protected override void StopListening(object source)
        {
            (source as CarDealer).NewCarInfo += CarDealer_NewCarInfo;
        }
    }
}


转载:http://blog.csdn.net/foreverling/article/details/38312927

目录
相关文章
|
7月前
|
数据管理 Java
Spigot开发中的事件与监听器的关系
在Spigot插件开发中,监听器(Listener)是一个非常重要的概念。它们允许你捕捉和处理各种游戏事件,使你的插件能够对玩家的行为、游戏环境的变化等做出响应。本文将详细介绍监听器是什么、它们的用途,并通过一个代码示例展示如何使用监听器。
59 0
|
8月前
在事件冒泡中,如何区分需要阻止传播的事件和不需要阻止的事件
在事件冒泡中,如何区分需要阻止传播的事件和不需要阻止的事件
|
8月前
LabVIEW使用多个事件结构来处理同一个事件
LabVIEW使用多个事件结构来处理同一个事件
239 0
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
101 0
|
SQL 存储 Oracle
Oracle数据库-设置10053事件的三种办法
Oracle数据库-设置10053事件的三种办法
263 0
|
Java C# 程序员
WPF程序中的弱事件模式
原文:WPF程序中的弱事件模式 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。 例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:     var...
1167 0
|
关系型数据库 MySQL 数据库连接
上下文管理器 | 学习笔记
快速学习 上下文管理器
SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
|
SQL 监控 JavaScript
Oracle 18.3 : 透过告警日志从安装初始化过程看 18c 的新改变
Oracle Database 18c 已经正式对外发布,第一个公共版本的版本号是 18.3 ,让我们从 18.3 的安装过程来一睹 18c 的改变。
2064 0
|
数据安全/隐私保护 Windows