1. 程式人生 > >觀察者貓叫案例

觀察者貓叫案例

觀察者模式:貓叫了-->老鼠跑了,人醒了

  (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();
    }

  }