设计模式-----观察者模式

来源:互联网 发布:软件编程工具官网下载 编辑:程序博客网 时间:2024/04/19 17:30

 

//观察者 如果增加观察者只要 实现接口IObserver 然后注册Register() 你要增加的观察者即可以···· 不需要的时候注销即可UnRegister()`````
//被观察者 要实现接口 IObservable 然后增加 遍历通知注册的观察者即可NotifyObservers()

//“观察者”接口 
public interface IObserver
{
   
void Notify(object anObject);
}


//“被观察对象”接口 
public interface IObservable
{
   
void Register(IObserver anObserver);
   
void UnRegister(IObserver anObserver);
}

public class ObservableImpl : IObservable
{

   
//保存观察对象的容器    
   
//注意 此处用Hashtable 和 泛型都可以··· 但是偶不知道那个更好··
   
//protected Hashtable _observerContainer = new Hashtable();
   protected List<IObserver> _observerContainer = new List<IObserver>();

   
//注册观察者 
   public void Register(IObserver anObserver)
   
{
     
//  _observerContainer.Add(anObserver, anObserver);
       _observerContainer.Add(anObserver);
   }


   
//撤销注册 
   public void UnRegister(IObserver anObserver)
   
{
       
//_observerContainer.Remove(anObserver);
       _observerContainer.Remove(anObserver);
   }


   
//将事件通知观察者 
   public void NotifyObservers(object anObject)
   
{
       
//枚举容器中的观察者,将事件一一通知给他们 
       foreach (IObserver anObserver in _observerContainer)
       
{
           anObserver.Notify(anObject);
       }

   }

}

public class SomeData : ObservableImpl
{
   
//被观察者中的数据 
   float m_fSomeValue;

   
//改变数据的属性 
   public float SomeValue
   
{
       
set
       
{
           m_fSomeValue 
= value;
           NotifyObservers(m_fSomeValue);
//将改变的消息通知观察者 
       }

   }

}

//用户界面(观察者) 
public class SomeKindOfUI : IObserver
{
   
public void Notify(object anObject)
   
{
       Console.WriteLine(
"The new value is:" + anObject);
   }

}

public class AnOtherUi : IObserver
{
   
IObserver 成员

    
}

//实际调用的过程 
public class MainClass
{
   
public static void Main()
   
{
       
//创建观察者和被观察者 
       SomeKindOfUI ui = new SomeKindOfUI();
       AnOtherUi uo 
= new AnOtherUi();
       SomeData data 
= new SomeData();
       data.Register(uo);

       
//在被观察对象中注册观察者 
       data.Register(ui);

       
//改变被观察对象中的数据,这时被观察者会通知观察者 
       data.SomeValue = 1000f;

       
//注销观察者,停止观察 
       data.UnRegister(ui);
       data.SomeValue 
= 1000f;
   }

}
 
原创粉丝点击