C#委托本质探索 六、领导委托下属做某事的正确表示
// 回归最初的例子
// 领导委托下属做某事
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1.SixthTest
{
class SixthTest
{
public void DoTest()
{
领导 朱哥 = new 领导();
Console.WriteLine("最初朱哥处理任务的执行情况");
朱哥.处理任务();
Console.ReadLine();
下属 小薇 = new 下属(朱哥);
Console.WriteLine("小薇加入后,朱哥处理任务的执行情况");
朱哥.处理任务();
}
}
delegate string 委托任务(string 任务内容);
class 领导
{
public 委托任务 领导委托的任务;
private string 领导自己的任务(string 任务内容)
{
if (领导委托的任务 != null)
return 领导委托的任务(任务内容);
else
return "没人给干,闲着发呆!";
}
public void 处理任务()
{
// 时机来临了
Console.WriteLine(领导自己的任务("运营魔兽世界"));
}
}
class 下属
{
public 下属(领导 下属的领导)
{
//将自己的工作与领导委托的工作挂钩
下属的领导.领导委托的任务 += new 委托任务(下属自己的工作);
}
private string 下属自己的工作(string 任务内容)
{
StringBuilder 工作内容 = new StringBuilder();
if (任务内容 == "运营魔兽世界")
{
工作内容.AppendLine("安排设备采购");
工作内容.AppendLine("招募客服,上岗培训");
工作内容.AppendLine("广告宣传");
工作内容.AppendLine("游戏上市");
工作内容.AppendLine("推出活动");
工作内容.AppendLine("…………");
}
else if (任务内容 == "处理业内竞争")
{
工作内容.AppendLine("调查竞争对手");
工作内容.AppendLine("展开斗争");
}
return 工作内容.ToString();
}
}
// 转变成实例的过程还是不顺利,不过最终搞定了.运行测试,好玩,开心!
// 朱哥没有小薇时他处理"运营魔兽世界"任务的结果是"没人给干,闲着发呆!"
// 小薇成为朱哥的下属后,接受了朱哥委托的任务,
// 朱哥再次处理"运营魔兽世界"的任务,结果不再是发呆,工作有人帮着做了.
// 对比Form上放一个Button的工作原理,Form内部定义了Button的实例button1, Button的事件处理为私有.
// 下属的构造方法传入领导实例,这样定义是为了把领导实例放在测试代码中,方便测试未绑定事件前的情况.
// 领导的任务处理公布出来,同样也是为了测试运行情况.
// 这个例子之所以与Form-Button的形式有差别,仅仅是为了公开Button类的执行情况.
// 整个过程中朱哥只忙自己的事,期间查看一下自己委托出去的事情.
// 小薇加入后接过委托的任务,以自己的能力把领导交待下来的事做好了.
// 从另一个角度讲,虽然说朱哥只忙了自己这一块事,实际上小薇"自己的工作"是由朱哥实际调用的.
// 观察这一现象,我们可以把朱哥"领导自己的任务"方法理解成为一个监听,
// 调用委托出去的事情,可以理解成调用了外部某个对象的方法.
// 说着说着就成了Observer设计模式了.
// 变量的用法还可以做为函数的参数传递.下个例子进行这方面的研究.
}