(二)、利用委托的实现:
下面有个例子:在C# 控制台应用程序编辑运行成功:
using System;
namespace CSharpConsole
{
// 定义委托
public delegate void PlayGameHandler(object sender,System.EventArgs e);
// 负责扣钱的人----主管
public class 主管
{
public 主管()
{
Console.WriteLine("生成主管");
}
public void 扣薪水(object sender,EventArgs e)
{
Console.WriteLine("主管:好小子,上班时间胆敢玩游戏");
Console.WriteLine("主管:看看你小子有多少薪水");
员工 employee = (员工)sender;
Console.WriteLine("开始扣薪水...");
System.Threading.Thread.Sleep(1000);
employee.薪水 = employee.薪水 - 500;
Console.WriteLine("扣薪水执行完毕.");
}
}
// 如果玩游戏,则会引发事件
public class 员工
{
// 先定义一个事件,这个事件表示员工在玩游戏。
public event PlayGameHandler PlayGame;
// 保存员工薪水的变量
private int m_Money;
public 员工()
{
Console.WriteLine("生成员工.");
m_Money = 1000; // 构造函数,初始化员工的薪水。
}
public int 薪水 // 此属性可以操作员工的薪水 。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("员工开始玩游戏了..");
Console.WriteLine("员工:CS真好玩,哈哈哈! 我玩...");
System.Threading.Thread.Sleep(1000);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
if(PlayGame != null)
{
PlayGame(this,e);
}
}
}
public class 场景
{
[STAThread]
public static void Main(string[] args)
{
Console.WriteLine("场景开始了.");
// 生成主管类的对象实例 小王
主管 小王 = new 主管();
// 生成员工类的对象实例 小张
员工 小张 = new 员工();
// 设下委托,指定监视
小张.PlayGame += new PlayGameHandler(小王. 扣薪水);
Console.WriteLine("该员工本有的薪水:" + 小张.薪水.ToString());
// 员工开始玩游戏
小张.玩游戏();
Console.WriteLine("现在该员工还剩下:" +小张.薪水.ToString());
Console.WriteLine("场景结束");
Console.ReadLine();
}
}
}
对于前面提出的问题:
1、 解耦了主管类和员工类之间的必然联系,可以单独创建员工类对象实例,而不用管是否有主管类对象实例的存在;
2、 在客户程序需求变化时:
(1)、我们只需修改客户程序,即上面例子里的class 场景,将委托改为如下:
保安 小李 = new 保安();
小张.PlayGame += new PlayGameHandler(小李. 扣薪水);
即可实现由保安来负责扣薪水的需求变化,而不用动员工类。
(2)、我们只需修改客户程序,即上面例子里的class 场景,添加一个如下的委托:
小张.PlayGame += new PlayGameHandler(某某. 扣绩效分);
这个“某某”可以是主管,也可以是其他新的角色(新的类),只需要在“某某”对应的类里定义扣绩效分的动作即可,而不用动员工类。
四、总结:
当然,不使用委托和事件我们仍然可以设计出解耦的类,然而却会增加很多的类、接口以及关联等等,增加了代码量和程序的逻辑复杂性,而在.net里利用委托和事件我们只需少的多的代码来实现。
委托和事件的使用有如下几个要素:
1、激发事件的对象-----就是员工小张
2、处理对象事件的对象-----就是主管小王
3、定义委托,就是你让主管小王监视员工小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。[@more@]
下面有个例子:在C# 控制台应用程序编辑运行成功:
using System;
namespace CSharpConsole
{
// 定义委托
public delegate void PlayGameHandler(object sender,System.EventArgs e);
// 负责扣钱的人----主管
public class 主管
{
public 主管()
{
Console.WriteLine("生成主管");
}
public void 扣薪水(object sender,EventArgs e)
{
Console.WriteLine("主管:好小子,上班时间胆敢玩游戏");
Console.WriteLine("主管:看看你小子有多少薪水");
员工 employee = (员工)sender;
Console.WriteLine("开始扣薪水...");
System.Threading.Thread.Sleep(1000);
employee.薪水 = employee.薪水 - 500;
Console.WriteLine("扣薪水执行完毕.");
}
}
// 如果玩游戏,则会引发事件
public class 员工
{
// 先定义一个事件,这个事件表示员工在玩游戏。
public event PlayGameHandler PlayGame;
// 保存员工薪水的变量
private int m_Money;
public 员工()
{
Console.WriteLine("生成员工.");
m_Money = 1000; // 构造函数,初始化员工的薪水。
}
public int 薪水 // 此属性可以操作员工的薪水 。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("员工开始玩游戏了..");
Console.WriteLine("员工:CS真好玩,哈哈哈! 我玩...");
System.Threading.Thread.Sleep(1000);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
if(PlayGame != null)
{
PlayGame(this,e);
}
}
}
public class 场景
{
[STAThread]
public static void Main(string[] args)
{
Console.WriteLine("场景开始了.");
// 生成主管类的对象实例 小王
主管 小王 = new 主管();
// 生成员工类的对象实例 小张
员工 小张 = new 员工();
// 设下委托,指定监视
小张.PlayGame += new PlayGameHandler(小王. 扣薪水);
Console.WriteLine("该员工本有的薪水:" + 小张.薪水.ToString());
// 员工开始玩游戏
小张.玩游戏();
Console.WriteLine("现在该员工还剩下:" +小张.薪水.ToString());
Console.WriteLine("场景结束");
Console.ReadLine();
}
}
}
对于前面提出的问题:
1、 解耦了主管类和员工类之间的必然联系,可以单独创建员工类对象实例,而不用管是否有主管类对象实例的存在;
2、 在客户程序需求变化时:
(1)、我们只需修改客户程序,即上面例子里的class 场景,将委托改为如下:
保安 小李 = new 保安();
小张.PlayGame += new PlayGameHandler(小李. 扣薪水);
即可实现由保安来负责扣薪水的需求变化,而不用动员工类。
(2)、我们只需修改客户程序,即上面例子里的class 场景,添加一个如下的委托:
小张.PlayGame += new PlayGameHandler(某某. 扣绩效分);
这个“某某”可以是主管,也可以是其他新的角色(新的类),只需要在“某某”对应的类里定义扣绩效分的动作即可,而不用动员工类。
四、总结:
当然,不使用委托和事件我们仍然可以设计出解耦的类,然而却会增加很多的类、接口以及关联等等,增加了代码量和程序的逻辑复杂性,而在.net里利用委托和事件我们只需少的多的代码来实现。
委托和事件的使用有如下几个要素:
1、激发事件的对象-----就是员工小张
2、处理对象事件的对象-----就是主管小王
3、定义委托,就是你让主管小王监视员工小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8781179/viewspace-924834/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8781179/viewspace-924834/