什么时候该用委托,为什么要用委托,委托有什么好处「终于解决」

什么时候该用委托,为什么要用委托,委托有什么好处「终于解决」好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处…看完下面的文章你将茅塞顿开…(看不懂的直接TDDTDS)概念虽然我不喜欢讲太多我们直接先来YY个场景:我很喜欢打游戏,但运气不好每次打游戏都会被主管看到,朱老板不喜欢他的员工在上班的时间打游戏,所以朱老板就跟主管说:以后员工在打游戏,你就扣他20块钱.这其实就是一个委托,朱老板委托主管一旦发现员工打游戏,就做一件事情….

大家好,欢迎来到IT知识分享网。

好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处…

看完下面的文章你将茅塞顿开…(看不懂的直接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()
   {
   Console.WriteLine("员工:开始玩游戏了..");
   Console.ReadKey();
   Console.WriteLine("员工:CS真好玩,哈哈哈! 我玩...");
   Console.ReadKey();
   Manager.RemoveMoney(this);
   }

}


主管类:    
public class Manager
{    
   public Manager()
   {

   }
   //扣薪水
   public void RemoveMoney(Employee employee)
   {
       Console.WriteLine ("主管:上班时间胆敢玩游戏");
       Console.ReadKey();
       Console.WriteLine("主管:看看你小子有多少薪水:" + employee.Money);
       Console.ReadKey();
       Console.WriteLine("主管:我开始扣薪水...");
       Console.ReadKey();
       employee.Money -= 20;
       Console.WriteLine("主管:扣好了.");
       Console.ReadKey();
       Console.WriteLine("主管:看看你小子薪水剩余:" + employee.Money);
       Console.ReadKey();
   }    
}

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;
   Console.WriteLine(emp.money);
   }
}

那么调用就变的简单了


Manager xiaotao = new Manager();
// 生成员工类的对象实例 shulin
Employee shulin = new Employee();

// 设下委托,指定监视
shulin.play += new Play(xiaotao.RemoveMoney);

// 员工开始玩游戏,玩一次扣一次
shulin.PlayGame();
shulin.PlayGame();
Console.ReadKey();

输出:

2180
2160

总结:

当然,不使用委托和事件我们仍然可以设计出解耦的类,然而却会增加很多的类、接口以及关联等等,增加了代码量和程序的逻辑复杂性,而在.net里利用委托和事件我们只需少的多的代码来实现。

http://www.cnblogs.com/superpcer/archive/2011/06/06/2073751.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25043.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信