觀察者模式(利用委托)
阿新 • • 發佈:2018-06-18
利用 lin 定義 cati eve 實例化 namespace esp spa
1.添加三個類文件,定義三個類(貓、狗、老鼠)
貓是主要事件
namespace MyDelegate { public class Cat { public CatMiaoHandler CatMiaoHandlerMethod;//在Cat類實例化一個委托 public void Miao() { Console.WriteLine("貓,叫一聲"); if (CatMiaoHandlerMethod!=null)//若委托不為空,執行委托 { CatMiaoHandlerMethod(); } } }public delegate void CatMiaoHandler(); }
namespace MyDelegate { public class Dog { public static void Wang() { Console.WriteLine("狗,叫一聲"); } } }
namespace MyDelegate { public class Mouse { public static void Run() { Console.WriteLine("老鼠,跑"); } } }
2.當貓叫時,狗也叫,老鼠跑(這就是觀察者模式)
Program程序如下
namespace MyDelegate { class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托 cat.CatMiaoHandlerMethod+= Mouse.Run;//多播委托, cat.Miao(); Console.Read(); } } }
3.委托和事件的區別
namespace MyDelegate { class Program { static void Main(string[] args) { Cat cat = new Cat(); //--------------------------對比---------------------------- //cat.CatMiaoHandlerMethodEvent = new CatMiaoHandler(Dog.Wang); //此處會報錯,事件不能實例化 //cat.CatMiaoHandlerMethodEvent = null;//此處會報錯,事件不能賦null值 //cat.CatMiaoHandlerMethodEvent();//此處會報錯,事件不能被外部調用 //cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托可以實例化 //cat.CatMiaoHandlerMethod = null;//委托可以賦值為null //cat.CatMiaoHandlerMethod();//委托可以直接調用 //--------------------------總結--------------------------- //委托不太安全,可能會被外部清除已經賦予的委托函數 cat.CatMiaoHandlerMethod += Dog.Wang; cat.CatMiaoHandlerMethod += Mouse.Run; cat.Miao(); //事件只能進行-=或+=賦值,不能進行=new或=null操作 cat.CatMiaoHandlerMethodEvent += Dog.Wang; cat.CatMiaoHandlerMethodEvent += Mouse.Run; cat.Miao(); Console.Read(); } } }
另外,委托可以按委托調用函數的順序查看委托函數,而事件查看不了
foreach(CatMiaoHandler s in cat.CatMiaoHandlerMethod.GetInvocationList()) { Console.WriteLine(s.Method); }
觀察者模式(利用委托)