观察者猫叫案例

观察者模式:猫叫了-->老鼠跑了,人醒了

 (2010-09-23 17:52:57)
标签: 

it

分类: c#

猫叫了-->老鼠跑了,人醒了
public interface Observer
  {
    void Response();  //观察者的响应,如是老鼠见到猫的反映
  }
  public interface Subject
  {
    void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
  }
  public class Mouse : Observer
  {
    private string name;
    public Mouse(string name, Subject subj)
    {    
      this.name = name;
      subj.AimAt(this);
    }
   
    public void Response()
    {
      Console.WriteLine(name + " attempt to escape!");
    }
  }
  public class Master : Observer
  {
    public Master(Subject subj)
    {    
      subj.AimAt(this);
    }
   
    public void Response()
    {
      Console.WriteLine("Host waken!");
    }
  }
 
  public class Cat : Subject
  {
    private ArrayList observers;
    public Cat()
    {
      this.observers = new ArrayList();
    }
    public void AimAt(Observer obs)
    {
      this.observers.Add(obs);
    }
    public void Cry()
    {
      Console.WriteLine("Cat cryed!");
      foreach (Observer obs in this.observers)
      {
        obs.Response();
      }
    }
  }
  class MainClass
  {  
    static void Main(string[] args)
    {
      Cat cat = new Cat();
      Mouse mouse1 = new Mouse("mouse1", cat);
      Mouse mouse2 = new Mouse("mouse2", cat);
      Master master = new Master(cat);
      cat.Cry();
    }
  }


//---------------------------------------------------------------------------------------------

设计方法二: 使用event -- delegate设计..
  public delegate void SubEventHandler();
  public abstract class Subject
  {
    public event SubEventHandler SubEvent;
    protected void FireAway()
    {
      if (this.SubEvent != null)
        this.SubEvent();
    }
  }
  public class Cat : Subject
  {
    public void Cry()
    {
      Console.WriteLine("cat cryed.");
      this.FireAway();
    }
  }
  public abstract class Observer
  {
    public Observer(Subject sub)
    {
      sub.SubEvent += new SubEventHandler(Response);
    }
    public abstract void Response(); 
  }
  public class Mouse : Observer
  {
    private string name;
    public Mouse(string name, Subject sub) : base(sub)
    {
      this.name = name;
    }
    public override void Response()
    {
      Console.WriteLine(name + " attempt to escape!");
    }
  }
  public class Master : Observer
  {
    public Master(Subject sub) : base(sub){}
    public override void Response()
    {
      Console.WriteLine("host waken");
    }
  }
  class Class1
  {
    static void Main(string[] args)
    {
      Cat cat = new Cat();
      Mouse mouse1 = new Mouse("mouse1", cat);
      Mouse mouse2 = new Mouse("mouse2", cat);
      Master master = new Master(cat);
      cat.Cry();
    }

  }

posted @ 2018-12-13 21:17  大旗1401  阅读(123)  评论(0编辑  收藏  举报