|
接口
现在,彼得成了一个特殊的人,他不但能容忍吝啬的老板,而且和他周围的宇宙也有了密切的联系,以至于他认为宇宙对他的工作进度也感兴趣。不幸的是,他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来,于是他决定把方法分离为一个接口:
namespace皮特的故事_接口版
{
//工人报告工作进度事件接口
interface IWorkerEvents
{
void WorkStarted();
void WorkProgressing();
int WorkCompleted();
}
class Worker
{
//声明接口类型变量指向实现接口的类
private IWorkerEvents _events;
public void Advise(IWorkerEvents events)
{
_events = events;
}
public void DoWork()
{
Console.WriteLine("工人报告工作进度: 工作开始");
//如果老板有在,通知老板,并得到老板的反应
if (_events != null) _events.WorkStarted();
Console.WriteLine("工人报告工作进度: 工作进行中");
//如果老板有在,通知老板,并得到老板的反应
if (_events != null) _events.WorkProgressing();
Console.WriteLine("工人报告工作进度: 工作完成");
//如果老板有在,通知老板,并得到老板的评分
if (_events != null)
{
int grade = _events.WorkCompleted();
Console.WriteLine("工人的工作得分:" + grade+"分");
}
}
}
//老板类实现工人报告工作进度事件接口
class Boss : IWorkerEvents
{
//老板不关心工作开始
public void WorkStarted()
{
Console.WriteLine("老板说:“没干完别来烦我!”");
}
//老板不关心工作进行情况
public void WorkProgressing()
{
Console.WriteLine("老板说:“没干完别来烦我!”");
}
//老板关心工作结果
public int WorkCompleted()
{
Console.WriteLine("老板说:“我看看结果,还不错!”");
return 4; /* 总分为5分*/
}
}
class Universe : IWorkerEvents
{
//宇宙关心工作开始
public void WorkStarted()
{
Console.WriteLine("宇宙说:“好,加油!”");
}
//宇宙关心工作进行情况
public void WorkProgressing()
{
Console.WriteLine("宇宙说:“干得听不错的,继续努力!”");
}
//宇宙关心工作结果
public int WorkCompleted()
{
Console.WriteLine("宇宙说:“我看看结果,还不错!”");
return 4; /* 总分为5分*/
}
}
class Text
{
static void Main()
{
Worker peter = new Worker();
//生成老板实例
Boss boss = new Boss();
//生成宇宙实例
Universe universe = new Universe();
//开始通知老板,要开始干活了
//一次工作的过程只能通知其中一方(老板或宇宙),无法同时通知所有实现接口的对象。
//peter.Advise(universe);
// peter.Advise(boss);
//peter.DoWork();
//这样写实际只通知了老板,没通知到宇宙
peter.Advise(universe);
peter.Advise(boss);
peter.DoWork();
//下面这样写实际上是执行了两次工作,第一次通知了宇宙,第二次通知了老板
//peter.Advise(universe);
//peter.DoWork();
//peter.Advise(boss);
//peter.DoWork();
Console.WriteLine("工人工作完成了。");
Console.ReadLine();
}
}
}
|
|