从前
在南方一块奇异的土地上
有个工人名叫彼得
他非常勤奋
对他的老板总是百依百顺
但是他的老板是个吝啬的人
从不信任别人
坚决要求随时知道彼得的工作进度
以防止他偷懒
但是彼得又不想让老板呆在他的办公室里站在背后盯着他
于是就对老板做出承诺
无论何时
只要我的工作取得了一点进展我都会及时让你知道
彼得通过周期性地使用
带类型的引用
(原文为
typed reference
也就是delegate??)
回调
他的老板来实现他的承诺
如下
class Worker {
public void Advise(Boss boss) { _boss = boss; }
public void DoWork() {
ConsoleWriteLine(工作: 工作开始);
if( _boss != null ) _bossWorkStarted();
ConsoleWriteLine(工作: 工作进行中);
if( _boss != null ) _bossWorkProgressing();
ConsoleWriteLine(工作: 工作完成);
if( _boss != null ) {
int grade = _bossWorkCompleted();
ConsoleWriteLine(工人的工作得分= + grade);
}
}
private Boss _boss;
}
class Boss {
public void WorkStarted() { /* 老板不关心 */ }
public void WorkProgressing() { /*老板不关心 */ }
public int WorkCompleted() {
ConsoleWriteLine(时间差不多!);
return ; /* 总分为 */
}
}
class Universe {
static void Main() {
Worker peter = new Worker();
Boss boss = new Boss();
peterAdvise(boss);
peterDoWork();
ConsoleWriteLine(Main: 工人工作完成);
ConsoleReadLine();
}
}
接口
现在彼得成了一个特殊的人他不但能容忍吝啬的老板而且和他周围的宇宙也有了密切的联系以至于他认为宇宙对他的工作进度也感兴趣不幸的是他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度彼得想要把潜在的通知的列表和这些通知的实现方法分离开来于是他决定把方法分离为一个接口
interface IWorkerEvents {
void WorkStarted();
void WorkProgressing();
int WorkCompleted();
}
class Worker {
public void Advise(IWorkerEvents events) { _events = events; }
public void DoWork() {
ConsoleWriteLine(工作: 工作开始);
if( _events != null ) _eventsWorkStarted();
ConsoleWriteLine(工作: 工作进行中);
if(_events != null ) _eventsWorkProgressing();
ConsoleWriteLine(工作: 工作完成);
if(_events != null ) {
int grade = _eventsWorkCompleted();
ConsoleWriteLine(工人的工作得分= + grade);
}
}
private IWorkerEvents _events;
}
class Boss : IWorkerEvents {
public void WorkStarted() { /* 老板不关心 */ }
public void WorkProgressing() { /* 老板不关心 */ }
public int WorkCompleted() {
ConsoleWriteLine(时间差不多!);
return ; /* 总分为 */
}
}
委托
不幸的是每当彼得忙于通过接口的实现和老板交流时就没有机会及时通知宇宙了至少他应该忽略身在远方的老板的引用好让其他实现了IWorkerEvents的对象得到他的工作报告
他的老板还是抱怨得很厉害彼得!他老板吼道你为什么在工作一开始和工作进行中都来烦我?!我不关心这些事件你不但强迫我实现了这些方法而且还在浪费我宝贵的工作时间来处理你的事件特别是当我外出的时候更是如此!你能不能不再来烦我?
[] [] []