浅学C#(10)——彼得的故事(1)

版权声明:转载请注明出处 https://blog.csdn.net/le_17_4_6/article/details/86590768

彼得的故事

1、从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”“回调”他的老板来实现他的承诺,如下:

using System;

class Worker {
       public void Advise(Boss boss) { _boss = boss; }
       public void DoWork() {
           Console.WriteLine("工作: 工作开始");
           if( _boss != null ) _boss.WorkStarted();

           Console.WriteLine("工作: 工作进行中");
           if( _boss != null ) _boss.WorkProgressing();

           Console.WriteLine("工作: 工作完成");
           if( _boss != null ) {
               int grade = _boss.WorkCompleted();
               Console.WriteLine("工人的工作得分=" + grade);
       }
}
private Boss _boss;
}

class Boss {
       public void WorkStarted() { Console.WriteLine("老板不关心工作开始!"); }
    public void WorkProgressing() { Console.WriteLine("老板不关心工作进展!"); }
       public int WorkCompleted() {
           Console.WriteLine("时间差不多!");
           return 2; /* 总分为10 */
       }
}

class Universe {
       static void Main() {
           Worker peter = new Worker();
           Boss boss = new Boss();
           peter.Advise(boss);
           peter.DoWork();
           Console.WriteLine("Main: 工人工作完成");
           Console.ReadLine();
       }
}

2、现在,彼得成了一个特殊的人,他不但能容忍吝啬的老板,而且和他周围的宇宙也有了密切的联系,以至于他认为宇宙对他的工作进度也感兴趣。不幸的是,他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。另外,彼得还想把工作进度通知给他的家人。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来,于是他决定把方法分离为一个接口:

using System;
interface IWorkerEvents {
       void WorkStarted();
       void WorkProgressing();
       int WorkCompleted();
}
class Worker {
       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);
               }
       }
       private IWorkerEvents _events;
}
class Boss : IWorkerEvents {
       public void WorkStarted() { Console.WriteLine("老板不关心工作开始!"); }
       public void WorkProgressing() { Console.WriteLine("老板不关心工作进展!"); }
       public int WorkCompleted() {
           Console.WriteLine("时间差不多!");
           return 3; /* 总分为10 */
       }
}
class  Family : IWorkerEvents{
      public void WorkStarted() {
           Console.WriteLine("工作开始了,注意身体!");
       }
      public  void  WorkProgressing( ) {
           Console.WriteLine("加油工作!");
      }
       public int WorkCompleted() {
           Console.WriteLine("快点回家吧,我们想你了!");
           return 7;
       }  
}
class  A {     
       static void Main() {
           Worker peter = new Worker();
           Boss boss = new Boss();
           Family  f=new Family( );
           peter.Advise(f); 
           peter.Advise(boss); //此时只能通知老板
           peter.DoWork(); //家人未被通知到
           Console.WriteLine("Main: 工人工作完成");
           Console.ReadLine();
       }
}

3、不幸的是,每当彼得忙于通过接口的实现和老板交流时,就没有机会及时通知家人和宇宙了。至少他应该忽略身在远方的老板的引用,好让其他实现了接口的对象得到工作报告

using System;
using System.Collections.Generic;
using System.Collections;

interface IWorkerEvents {
       void WorkStarted();
       void WorkProgressing();
       int WorkCompleted();
}
class Worker {
       public  void  RegistNotifiers(IWorkerEvents  nif) {
             notifiers.Add(nif);
       }              
       public void DoWork() {
           Console.WriteLine("工作: 工作开始");
           if  (notifiers!=null) {
           foreach (IWorkerEvents  notifier in notifiers)
               notifier.WorkStarted( );
           }
           Console.WriteLine("工作: 工作进行中");
           if  (notifiers!=null) {
            foreach (IWorkerEvents  notifier in notifiers)
               notifier.WorkProgressing( );
           }
           Console.WriteLine("工作: 工作完成");
           if (notifiers != null ) {
              foreach (IWorkerEvents  notifier in notifiers)
              {
                 int grade = notifier.WorkCompleted();
                 Console.WriteLine("工人的工作得分="+ grade);
               }
           }
       }
       private  ArrayList  notifiers=new ArrayList( ); //使用数组将要通知的人全部装进去
   }
class Boss : IWorkerEvents {
       public void WorkStarted() { Console.WriteLine("老板不关心工作开始!");   }
       public void WorkProgressing() { Console.WriteLine("老板不关心工作进展!"); }
       public int WorkCompleted() {
           Console.WriteLine("时间差不多!");
           return 3; /* 总分为10 */
       }
}
class  Family : IWorkerEvents{
      public void WorkStarted() {
           Console.WriteLine("工作开始了,注意身体!");
       }
      public  void  WorkProgressing( ) {
           Console.WriteLine("加油工作!");
      }
       public int WorkCompleted() {
           Console.WriteLine("快点回家吧,我们想你了!");
           return  10;
       }  
}
class  A {     
       static void Main() {
           Worker peter = new Worker();
           Boss boss = new Boss();
           Family  f=new Family( );
           peter.RegistNotifiers(boss);
           peter.RegistNotifiers(f);
           peter.DoWork();
           Console.WriteLine("Main: 工人工作完成");
           Console.ReadLine();
       }
}

4、他的老板还是抱怨得很厉害。“彼得”他老板吼道,“你为什么在工作一开始和工作进行中都来烦我?!我不关心这些事件。你不但强迫我实现了这些方法,而且还在浪费我宝贵的工作时间来处理你的事件,特别是当我外出的时候更是如此!你能不能不再来烦我?”

using System;
using System.Collections.Generic;
using System.Collections;

class  WorkerEvents {
       public  virtual  void WorkStarted() {
             Console.WriteLine("对工作开始不关心!");
        }
       public  virtual  void WorkProgressing()  {
             Console.WriteLine("对工作进展不关心!");
        }
       public  virtual  int WorkCompleted() {
             Console.WriteLine("对工作结束不关心!");
             return  0;
    }
}
class Worker{
       public  void  RegistNotifiers(WorkerEvents  nif) {
             notifiers.Add(nif);
       }              
       public void DoWork() {
           Console.WriteLine("工作: 工作开始");
           if  (notifiers!=null) {
           foreach (WorkerEvents  notifier in notifiers)
               notifier.WorkStarted( );
           }
           Console.WriteLine("工作: 工作进行中");
           if  (notifiers!=null) {
            foreach (WorkerEvents  notifier in notifiers)
               notifier.WorkProgressing( );
           }
           Console.WriteLine("工作: 工作完成");
           if (notifiers != null ) {
              foreach (WorkerEvents  notifier in notifiers)
              {
                 int grade = notifier.WorkCompleted();
                 Console.WriteLine("工人的工作得分=" + grade);
               }
           }
       }
       private  ArrayList  notifiers=new ArrayList( );
   }
class Boss : WorkerEvents {    
       public override int WorkCompleted() {
           Console.WriteLine("时间差不多!");
           return 3; /* 总分为10 */
       }
}
class  Family : WorkerEvents{   
       public override int WorkCompleted() {
           Console.WriteLine("快回家吧,我们想你了!");
           return  10;
       }  
}
class  A {     
       static void Main() {
           Worker peter = new Worker();
           Boss boss = new Boss();
           Family  f=new Family( );
           peter.RegistNotifiers(boss);
           peter.RegistNotifiers(f);
           peter.DoWork();
           Console.WriteLine("Main: 工人工作完成");
           Console.ReadLine();
       }
}

5、于是,彼得意识到接口虽然在很多情况都很有用,但是当用作事件时,“粒度”不够好。他希望能够仅在别人想要时才通知他们,于是他决定把接口的方法分离为单独的委托,每个委托都像一个小的接口方法:

using System;

delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();

class Worker {
       public void DoWork() {
           Console.WriteLine("工作: 工作开始");
           if( started != null ) started();
           Console.WriteLine("工作: 工作进行中");
           if( progressing != null ) progressing();
           Console.WriteLine("工作: 工作完成");
           if( completed != null ) {
               int grade = completed();
               Console.WriteLine("工人的工作得分=" + grade);
           }
       }
       public WorkStarted started;
       public WorkProgressing progressing;
       public WorkCompleted completed;
}

class Boss {
       public int WorkCompleted() {
       Console.WriteLine("Better...");
       return 4; /* 总分为10 */
  }
}

class  Family {
   public  int   WorkCompleted( ) {       
       Console.WriteLine("快回家吧,我们想你了!");
       return  10;
   }
}

class  Universe {
    public  static void  WorkStarted( ) {
      Console.WriteLine("universe know the start of work");
   }
   public  static  void  WorkProgressing( ) {
      Console.WriteLine("universe know the progressing of work");
   }
   public  static  int  WorkCompleted( ) {
       Console.WriteLine("universe say good!");
       return  8;
   }
}

class  A {
       static void Main() {
           Worker peter = new Worker();
           Boss boss = new Boss();
           Family  f=new  Family( );
           peter.started=new WorkStarted(Universe.WorkStarted);
           peter.progressing=new WorkProgressing(Universe.WorkProgressing);
           peter.completed=new  WorkCompleted(f.WorkCompleted);
           peter.completed=new  WorkCompleted(Universe.WorkCompleted);
           peter.completed = new WorkCompleted(boss.WorkCompleted);
           peter.DoWork();
           Console.WriteLine("Main: 工人工作完成");
           Console.ReadLine();
       }
}

猜你喜欢

转载自blog.csdn.net/le_17_4_6/article/details/86590768