用C#实现的Observer模式

Observer模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

第一个方法:使用传统方法(不用事件)

public interface Observer
 {
  void Update(Subject s);
 }

 public abstract class Subject
 {
  private ArrayList observers=new ArrayList();
  protected string state="";

  public virtual string State
  {
   get{return state;}
   set{state=value;Notify();}
  }
  public void Add(Observer o)
  {
   observers.Add(o);
  }
  public void Remove(Observer o)
  {
   observers.Remove(o);
  }
  protected void Notify()
  {
   foreach(Observer o in observers)
   {
    o.Update(this);
   }
  }
 }

 public class ConcreteSubject:Subject
 {
  override public string State
  {
   get{return state + "继承";}
   set{state=value+"_";Notify();}
  }  
 }

 public class FirstObserver:Observer
 {
  private string state="";
  public void Update(Subject s)
  {
   state=s.State+"观察1";
  }
  public string State
  {
   get{return state;}
  }
 }
 public class SecondObserver:Observer
 {
  private string state="";
  public void Update(Subject s)
  {
   state=s.State+"观察2";
  }
  public string State
  {
   get{return state;}
  }
 }

第二个方法:使用C#事件机制

public delegate void MyEventHandler(Subject s);
 public interface Observer
 {
  void Update(Subject s);
 }

 public abstract class Subject
 {
  protected string state="";

  public event MyEventHandler Events=null;

  public virtual string State
  {
   get{return state;}
   set{state=value;Notify();}
  }
  public void Add(Observer o)
  {
   Events +=new MyEventHandler(o.Update);
  }
  public void Remove(Observer o)
  {
   Events -=new MyEventHandler(o.Update);
  }
  protected void Notify()
  {
   if(Events!=null)
   {
    Events(this);
   }
  }
 }

 public class ConcreteSubject:Subject
 {
  override public string State
  {
   get{return state + "继承";}
   set{state=value+"_";base.Notify();}
  }  
 }

 public class FirstObserver:Observer
 {
  private string state="";
  public void Update(Subject s)
  {
   state=s.State+"观察1";
  }
  public string State
  {
   get{return state;}
  }
 }
 public class SecondObserver:Observer
 {
  private string state="";
  public void Update(Subject s)
  {
   state=s.State+"观察2";
  }
  public string State
  {
   get{return state;}
  }
 }

下面是个测试类:

 public class Test_Observer
 {
  private ConcreteSubject cs=null;
  private FirstObserver fo=null;
  private SecondObserver so=null;
  public Test_Observer()
  {
   cs=new ConcreteSubject();
   fo=new FirstObserver();
   so=new SecondObserver();

   cs.Add(fo);
   cs.Add(so);
  }
  public void SetState(string str)
  {
   cs.State=str;
  }
  public string GetFirstObserverState()
  {
   return fo.State;
  }
  public string GetSecondObserverState()
  {
   return so.State;
  }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值