public class DoSomeThing ...{ public void GiveCodeToManager(object sender, CustomeEvetnArgs e) ...{ result +=sender.ToString()+ "已经将分数:" + e.Code.ToString() + "送给Manager"; } public void RecodeCode(object sender, CustomeEvetnArgs e) ...{ result += sender.ToString() + "已经将分数:" + e.Code.ToString() + "记录"; } public void GiveCodeToOthers(object sender, CustomeEvetnArgs e) ...{ result += sender.ToString() + "已经将分数:" + e.Code.ToString() + "给其他人"; } } 传递的参数中有一个CustomeEvetnArgs,这是我们自定义的传递信息类。这个类将包含传递的分数,如下
public class CustomeEvetnArgs : EventArgs ...{ private string _code; public string Code ...{ get ...{ return _code; } set ...{ _code = value; } } } 我们还要有一个player类,运动员类,这个类中要根据时间的不同来调用dosomething类中的方法,并传递参数
public class player ...{ private string _code; public string Code ...{ get ...{ return _code; } set ...{ _code = value; } }
private string _thedate; public string TheDate ...{ get ...{ return _thedate; } set ...{ _thedate = value; } }
public void OnComplete() ...{ CustomeEvetnArgs e = new CustomeEvetnArgs(); e.Code = this.Code;
DoSomeThing things = new DoSomeThing(); if (_thedate == "Mon") ...{ things.GiveCodeToManager(this, e); } if (_thedate == "Tues") ...{ things.RecodeCode(this, e); } if (_thedate == "Wed") ...{ things.GiveCodeToOthers(this, e); } } } 这样基本类型就完成了,我们现在来调用它们
player green = new player(); green.Code = "A+"; green.TheDate = "Tues"; green.OnComplete(); Response.Write(result); 嗨,我们实现了这个游戏。测试一下,确实没有问题,如果你是一个细心的人也许你会回过头来检查你的代码,是否会发现一些不尽人意的地方?你会发现运动员类中包含的东西太多了,比如日期并不是一个运动员的属性,运动员和日期有什么关系呢?而运动员的唯一事件就是完成训练,他不需要去管其他事情了,他训练完了太累了,还要去送分数和记录成绩?也许他应该有个助手去做这些事情,所以在运动员类中并不应该出现那些if,他们使代码的耦合度太高了,当一个运动员想要改变他的训练流程时,他不得不改变player类。于是,委托出场了。
public delegate void MyDelegate(object sender, CustomeEvetnArgs e); 于是有了这个助手,green轻松多了,他终于不用管今天是星期几了,我们重新改一下player类,这个类中去掉了thedate属性,也没有了if,只有一个委托oncomplete事件在运动员OnComplete时触发
public class player ...{ private string _code; public string Code ...{ get ...{ return _code; } set ...{ _code = value; } } public event MyDelegate oncomplete; public void OnComplete() ...{ CustomeEvetnArgs e = new CustomeEvetnArgs(); e.Code = this.Code; if (oncomplete != null) ...{ oncomplete(this, e); } } } 而这个助手要看今天是星期几,然后执行相应的方法,date是今天的日期。
DoSomeThing things = new DoSomeThing(); if (date == "Mon") ...{ green.oncomplete += new MyDelegate(things.GiveCodeToManager); } if (date == "Tues") ...{ green.oncomplete += new MyDelegate(things.RecodeCode); } if (date == "Wed") ...{ green.oncomplete += new MyDelegate(things.GiveCodeToOthers); } green.OnComplete(); Response.Write(result); 这样万一游戏流程有了改变,那也跟green无关了,他只要专心训练,其他的由这个助手进行改动。