事件和观察者模式
這篇文章主要是用觀察者模式去理解事件
首先得清楚幾個基礎:
1.委托相當于c里面的指針
2.委托能夠動態傳遞方法
3.委托可以引用實例和靜態方法
4.委托的實質是類
5.事件是委托的集合封裝(這個就是經常有人說的事件就是多播委托,不違背面向對象的封裝特性)
觀察者模式(這里講非常經典的例子:貓叫老鼠跑)的問題
1.觀察者:老鼠。觀察的目標:貓
2.貓發出叫聲,老鼠跑(貓觸發事件,老鼠接收信息然后做出動作)
搞清楚這些接下來上菜:
(程序員秘籍:看代碼
專門針對新手和懶人模式開啟,都在注釋里面,客官請慢用)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace EverTest {class Program{static void Main(string[] args){//創建個貓Subject sub = new Subject();//老鼠觀察貓Obs obs = new Obs(sub);//貓觸發動作的方法sub.Method();//只有 assignment、call、increment、decrement、await 和 new 對象表達式可用作語句。。。。。我把方法的'()'去掉了。。。}}//觀察者:老鼠class Obs{//老鼠害怕哈哈哈public void Haipa(object obj, EventArgs e){Console.WriteLine("老鼠害怕了,叫醒同伴");}//老鼠吃狗糧 請無視這些命名public void Chigouliang(object obj, EventArgs e){Console.WriteLine("順便吃了一口狗糧");}//跑 這里是靜態類public static void Pao(object obj, EventArgs e){Console.WriteLine("拔腿就跑。。。。");}public Obs(Subject sub){//訂閱老鼠里面的方法sub.ONCallH += new Subject.CallH(Haipa);sub.ONCallH += new Subject.CallH(Chigouliang);sub.ONCallH += new Subject.CallH(Pao);//取消或注銷方法//sub.ONCallH -= new Subject.CallH(Pao);//注意:此處必須是+=或-=,如果是=那么就會報錯:事件“EverTest.Subject.ONCallH”只能出現在 += 或 -= 的左邊(從類型“EverTest.Subject”中使用時除外)//因為‘=’在這里是賦值,而‘+=’才是訂閱//老鼠的動作如果有其他的,只要添加方法訂閱方法,如果不要該動作就注銷或取消}}//目標:貓class Subject{//定義一個委托public delegate void CallH(object obj, EventArgs e);//定義一個此委托類型的事件public event CallH ONCallH;//模擬事件觸發,如果觸發就把信息發送給觀察者老鼠public void Method(){bool falg = false;Console.WriteLine("你聽到貓叫了沒(請用y和n回答):");//隨時都有可能發生這個事件while (!falg){if (Console.ReadLine() == "y"){//貓叫了,觸發了這個事件ONCallH(this, new EventArgs());}}}} }
總結
- 上一篇: 通过JS原型定义字符串格式化方法
- 下一篇: asp.net MVC的EF与easyu