设计模式之--Observer

来源:互联网 发布:java高级程序员证书 编辑:程序博客网 时间:2024/04/28 05:28
        在设计一组对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用,它可以使对象的状态与它们所依赖的对象的状态保持同步。 Observer Pattern推荐采用发布者--订阅者(publisher--subscriber)模型,使这组观察者(Observer)和主题(Subject)对象之间有清晰的界限。比较直观的形式是“注册--通知--撤消注册”。下面描述这样一个过程:
      1.Observer将自己注册到Subject中,Subject将Object存放在一个容器(Container)里。
      2.Observer对象发生某种变化,从Container中得到所有注册过的Observer,将变化通知Object。
      3.Object告诉Subject要撤消注册,Subject从Container中将Object除去。
      为了实现这种机制主题需要为注册注销和通知提供一个接口。
//interface the all observer classes should implement
public interface IObserver
{  
   void Notify(object anObject);
}
//interface that all observable classes should implement
public interface IObservable
{
   void Register(IObserver anObserver);
   void UnRegister(IObserver anObserver);
}
      下面是具体实现:
public class ObservableImpl: IObservable
{
    //container to store the observer instance
    protected Hashtable _observerContainer=new Hashtable();
    //add the observer
    public void Register(IObserver anObserver)
    {
        _observerContainer.Add(anObserver,anObserver);
    }
    //remove the observer
    public void UnRegister(IObserver anObserver)
    {
        _observerContainer.Remove(anObserver);
    }
    //common method to notify all the observers
    public void NotifyObservers(object anObject)
    {
        //enumeration the observers and invoke their notify method
        foreach(IObserver anObserver in _observerContainer.Keys)
        {
           anObserver.Notify(anObject);
        }
    }
}
      在 .NET 应用程序中可以使用这些构造,也可以引入委托事件实现Observer Pattern,这样不必开发专用于支持该模式的特定类型。以下是一道关于Observer Pattern不错的练习题:
      猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:1.要有联动性,老鼠和主人的行为是被动的。
         2.考虑可扩展性。