C#里的委托和事件实现Observer之三(转)

(二)、利用委托的实现:



下面有个例子:在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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值