【轉發】什么時候該用委托,為什么要用委托,委托有什么好處


好多人一直在問:什么時候該用委托,為什么要用委托,委托有什么好處....

看完下面的文章你將茅塞頓開..(看不懂的直接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里利用委托和事件我們只需少的多的代碼來實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM