弱事件模式(WPF里面就使用了弱事件模式)

/*
弱事件
直接连接发布程序和侦听器如果发布器不在连接侦听器的话垃圾回收不能清空侦听器。
这种强连接可以通过弱事件模式来解决。
*/
using System;
using System.Windows;

namespace Frank
{
	public class WeakCarInfoEventManager : WeakEventManager
	{
		///<summary>
		///添加监听
		///</summary>
		public static void AddListener(object source,IWeakEventListener listener)
		{
			CurrentMangeager.ProtectedAddListener(source,listener);
		}
		///<summary>
		///移除监听
		///</summary>
		public static void RemoveListener(object source,IWeakEventListener listener)
		{
			CurrentMangeager.ProtectedRemoveListener(source,listener);
		}
		public static WeakCarInfoEventManager CurrentMangeager
		{
			get
			{
				WeakCarInfoEventManager manager = GetCurrentManager(typeof(WeakCarInfoEventManager)) as WeakCarInfoEventManager;//返回当前的管理类
				if(manager==null)
				{
					manager = new WeakCarInfoEventManager();
					SetCurrentManager(typeof(WeakCarInfoEventManager),manager);//设置当前管理类
				}
				return manager;
			}
		}
		///<summary>
		/// 开始监听
		///</summary>
		protected override void StartListening(object source)
		{
			Console.WriteLine("开始监听");
			(source as Test2).MyEvent += MyMethod<int>;
		}
		void MyMethod<T>(object sender,EventArgs e) where T : struct//定义个委托方法并添加约束
		{
			DeliverEvent(sender,e);
		}
		///<summary>
		/// 移除监听
		///</summary>
		protected override void StopListening(object source)
		{
			Console.WriteLine("移除监听");
			(source as Test2).MyEvent -= MyMethod<int>;
		}
	}
	public interface Test3<in T,out T2>//输入T,返回T2
	{
		T2 Get(T t);
	}
	public class Test2
	{
		public delegate void MyDelegate<T>(object obj,EventArgs e) where T : struct;//自定义委托创建约束
		public event MyDelegate<int> MyEvent;//创建自定义委托类型的事件
		public void ExecMyEvent()
		{
			Console.WriteLine("执行事件");
			MyEvent(this,null);//执行事件
		}
	}
	
	public class Consumer : IWeakEventListener
	{
		private string name;
		public Consumer(string name)
		{
			this.name = name;
		}
		public void NewCarIsHere(object sender,string str)
		{
			Console.WriteLine("name:{0},inputStr:{1}",name,str);
		}
		bool IWeakEventListener.ReceiveWeakEvent(Type managerType,object sender,EventArgs e)
		{
			NewCarIsHere(sender,"1");
			return true;
		}
	}
	public class Test
    {
		//程序入口
        public static void Main(string[] args)
        {
			Test2 t = new Test2();
			Consumer c = new Consumer("jack");
			WeakCarInfoEventManager.AddListener(t,c);
			t.ExecMyEvent();

			Consumer c2 = new Consumer("tom");
			WeakCarInfoEventManager.AddListener(t,c2);
			t.ExecMyEvent();
			
			WeakCarInfoEventManager.RemoveListener(t,c2);
			t.ExecMyEvent();
			//实现了弱事件模式后,发布程序和侦听器就不再强连接了。当不再引用侦听器时,它就会被垃圾回收。
        }
	}
}

  

posted on 2013-11-30 13:37  wp456  阅读(306)  评论(0)    收藏  举报

导航