委托----http://www.cnblogs.com/superpcer/archive/2011/06/06/2073751.html
2013-04-25 18:46
387 查看
什么时候该用委托,为什么要用委托,委托有什么好处....
好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处....看完下面的文章你将茅塞顿开..(看不懂的直接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()
{
System.Diagnostics.Debug.WriteLine("员工:开始玩游戏了..");
System.Diagnostics.Debug.WriteLine("员工:CS真好玩,哈哈哈! 我玩...");
Manager.RemoveMoney(this);
}
}
主管类:
public class Manager
{
public Manager()
{
}
//扣薪水
public void RemoveMoney(Employee employee)
{
System.Diagnostics.Debug.WriteLine("主管:上班时间胆敢玩游戏");
System.Diagnostics.Debug.WriteLine("主管:看看你小子有多少薪水:" + employee.Money);
System.Diagnostics.Debug.WriteLine("主管:我开始扣薪水...");
employee.Money -= 20;
System.Diagnostics.Debug.WriteLine("主管:扣好了.");
System.Diagnostics.Debug.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里利用委托和事件我们只需少的多的代码来实现。
相关文章推荐
- c#委托,事件及观察者模式(转自:http://www.cnblogs.com/JimmyZhang/archive/2011/12/25/903360.html)
- 委托之异步(转自http://www.cnblogs.com/inforasc/archive/2009/10/21/1587756.html
- 理解委托和事件的好文章http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
- C#委托之个人理解(转自:http://www.cnblogs.com/michaelxu/archive/2008/03/31/1131500.html)
- RTP http://www.cnblogs.com/qingquan/archive/2011/07/28/2120440.html
- http://www.cnblogs.com/amylis_chen/archive/2010/07/15/1778217.html
- 终于记住回车和换行cr lf的来由和含义了 -参考: http://www.cnblogs.com/me115/archive/2011/04/27/2030762.html
- 在测试sql语句性能时先清空缓存【转自:http://www.cnblogs.com/yukaizhao/archive/2008/04/24/1168647.html】
- Zend Studio无法调试php代码转自(http://www.cnblogs.com/yaksea/archive/2011/08/26/2154154.html)
- auto_ptr http://www.cnblogs.com/jtf-china/archive/2011/06/09/2076792.html
- Android LayoutInflater详解 (转载:http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html)
- http文件头详解http://www.cnblogs.com/tiwlin/archive/2009/09/06/1561279.html
- C#编码规范 转 http://www.cnblogs.com/wulinfeng/archive/2012/08/31/2664720.html
- MongoDB 客户端 MongoVuehttp://www.cnblogs.com/shanyou/archive/2011/05/20/2052354.html
- 转自http://www.cnblogs.com/lzjsky/archive/2011/01/15/1936384.html
- C# 反射(一) 转自http://www.cnblogs.com/zhusl118/archive/2008/11/21/1338373.html
- 【C++设计技巧】C++中的RAII机制 http://www.cnblogs.com/gnuhpc/archive/2012/12/04/2802307.html
- 转载TortoiseSVN的使用详解1(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- 原文地址http://www.cnblogs.com/biyeymyhjob/archive/2012/07/12/2588074.html
- Silverlight中实现带CheckBox的多选下拉框--来源(附有实例代码):http://www.cnblogs.com/shiaupo/archive/2011/06/04/2072668.html