好多人一直在問:什么時候該用委托,為什么要用委托,委托有什么好處....
看完下面的文章你將茅塞頓開..(看不懂的直接TDDTDS)
概念雖然我不喜歡講太多
我們直接先來YY 個場景:我很喜歡打游戲,但運氣不好每次打游戲都會被主管看到,朱老板不喜歡他的員工在上班的時
間打游戲,所以朱老板就跟主管說:以后員工在打游戲,你就扣他20塊錢.
這其實就是一個委托,朱老板委托主管一旦發現員工打游戲,就做一件事情.
程序該怎么寫呢?
至少有2個類吧,主管與員工,主管有個方法扣錢,員工有個方法玩游戲,那么開始動工了
員工類:
public class Employee { //員工的薪水 private int money; //該員工的主管 private Manager Manager; public Employee(Manager manager) { // 通過構造函數,初始化員工的主管與薪水。 Manager = manager; money = 8000; } public int Money { get { return money; } set { money = value; } } public void PlayGame() { WriteLine("員工:開始玩游戲了.."); WriteLine("員工:CS真好玩,哈哈哈! 我玩..."); Manager.RemoveMoney(this); } }
主管類:
public class Manager { public Manager() {} //扣薪水 public void RemoveMoney(Employee employee) { WriteLine("主管:上班時間膽敢玩游戲"); WriteLine("主管:看看你小子有多少薪水:" + employee.Money); WriteLine("主管:我開始扣薪水..."); employee.Money -= 20; WriteLine("主管:扣好了."); WriteLine("主管:看看你小子薪水剩余:" + employee.Money); } }
MIan方法大概這么寫就行了:
public static void Main(string[] args) { // 生成主管類的對象實例 king Manager king = new Manager(); // 生成員工類類的對象實例 wind Employee wind = new Employee(king); // 員工開始玩游戲 wind.PlayGame(); }
運行,果然結果是對的,看來做為程序員我還是比較低調的..寫出來結果很正常,也不沾沾自喜..
員工:開始玩游戲了..
員工:CS真好玩,哈哈哈! 我玩...
主管:上班時間膽敢玩游戲
主管:看看你小子有多少薪水:8000
主管:我開始扣薪水...
主管:扣好了.
主管:看看你小子薪水剩余:7980
下面我們簡單的分析下這個程序:
1:在創建主管類之后才能創建員工類,耦合性太高,也就是說你要創建個員工,必須要先創建個主管..
2:如果場景發生以下變化,我要讓經理代替主管,我們不得不修改員工類,並增加經理類.
這樣看來這段程序設計的並不好,我們不妨來考慮下事件(特殊的委托)來實現
必須要定義一個委托,就是讓主管監視員工,然后員工類里要有個事件(員工也是激發該事件的對象),主管執行事件
public delegate void Play(Object Sender, System.EventArgs e); public class Employee { public int money = 2200;//懶得寫屬性了.. public event Play play; public Employee() { } public void PlayGame() { System.EventArgs e = new EventArgs(); OnPlayGame(this, e); } void OnPlayGame(object Sender, EventArgs e) { if (play != null) { play(Sender, e); } } }
主管類就要實現一個方法,這個方法與委托的返回直一樣,參數一樣就行了,給委托來調用的.:
public class Manager { public Manager() { } public void RemoveMoney(Object Sender, System.EventArgs e) { Employee emp = Sender as Employee; emp.money -= 20; System.Diagnostics.Debug.WriteLine(emp.money); } }
那么調用就變的簡單了
Manager xiaotao = new Manager(); // 生成員工類的對象實例 shulin Employee shulin = new Employee(); // 設下委托,指定監視 shulin.play += new Play(xiaotao.RemoveMoney); // 員工開始玩游戲,玩一次扣一次 e.PlayGame(); e.PlayGame();
輸出:
2180
2160
總結:
當然,不使用委托和事件我們仍然可以設計出解耦的類,然而卻會增加很多的類、接口以及關聯等等,增加了代碼量和程序的邏輯復雜性,而在.net里利用委托和事件我們只需少的多的代碼來實現。