DotNetFresh

博客园 首页 新随笔 联系 订阅 管理
/*****************************************************
* 一个观察者模式(Observer Pattern)例子
*本例子包括四个角色:
*1.抽象主题(ISubject) 2.抽象观察者(IObserver) 
*3.具体主题(ConcreteSubject) 4.具体观察者(ConcreteObserver)
*他们之间的关系是:当主题发生某种变化时,
*能够通知所有观察他的观察者发生改变了.
*****************************************************
*/


using System;
using System.Collections;

/// <summary>
///主题接口
/// </summary>

interface ISubject
{
    
string Name {set;get;} //主题的名称
    void AddObserver(IObserver observer); //添加观察者方法
    void DelObserver(IObserver observer); //删除观察者方法
    void Notify(); //通知所有观察者方法
}


/// <summary>
/// 观察者接口
/// </summary>

interface IObserver
{
    
void Update(); //更新观察者的状态
}


/// <summary>
/// 主题
/// </summary>

class Subject : ISubject
{
    
private string name = string.Empty;
    
private string state = string.Empty;
    
private ArrayList observers = new ArrayList();

    
public string State
    
{
        
get return this.state; }
        
set this.state = value; }
    }


    
#region ISubject 成员

    
public string Name
    
{
        
get
        
{
            
return this.name;
        }

        
set
        
{
            
this.name = value;
        }

    }


    
public void AddObserver(IObserver observer)
    
{
        
this.observers.Add(observer);
    }


    
public void DelObserver(IObserver observer)
    
{
        
this.observers.Remove(observer);
    }


    
public void Notify()
    
{
        
foreach(IObserver observer in observers)
            observer.Update();
    }


    
#endregion

}


/// <summary>
/// 观察者
/// </summary>

class Observer : IObserver
{
    
private string observerState = string.Empty; //观察者观察主题的状态
    private string name = string.Empty; //观察者名称
    private Subject subject = null;    //所观察的主题

    
public Observer(Subject subject,string name)
    
{
        
this.subject = subject;
        
this.name = name;
    }


    
#region IObserver 成员

    
public void Update()
    
{
        
this.observerState = subject.State;
        Console.WriteLine(
"Observer {0}'s new state is {1}!",this.name,this.subject.State);
    }


    
#endregion

}


class Client
{
    
public static void Main(string[] args)
    
{
        Subject s 
= new Subject();
        s.AddObserver(
new Observer(s,"woody"));
        s.AddObserver(
new Observer(s,"hello"));
        s.State 
= "test";
        s.Notify();

        Console.Read();
    }

}
posted on 2005-04-30 11:37  DotNetFresh  阅读(1089)  评论(2编辑  收藏  举报