我正在閱讀(奇妙)書籍Head First Design Patterns
,需要對觀察者模式進行一些說明。下面的一小段代碼模擬了一個監聽天氣模式更新的設備(CurrentConditionDisplay)。C中的觀察者模式#
接口:
public interface ISubject
{
void RegisterObserver(IObserver obs);
void RemoveObserver(IObserver obs);
void NotifyObservers();
}
public interface IDisplay
{
string Display();
}
public interface IObserver
{
void Update(float temperature, float humidity, float pressure);
}
觀察
public class CurrentConditionDisplay : IObserver, IDisplay
{
private float temperature;
private float humidity;
private float pressure;
private ISubject weatherData;
public CurrentConditionDisplay(ISubject weatherData)
{
this.weatherData = weatherData;
this.weatherData.RegisterObserver(this);
}
public string Display()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Welcome to Current Condition Display...");
sb.AppendLine(this.temperature.ToString());
sb.AppendLine(this.humidity.ToString());
sb.AppendLine(this.pressure.ToString());
return sb.ToString();
}
public void Update(float temperature, float humidity, float pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
}
}
主題
public class WeatherData : ISubject
{
private List<IObserver> observersList;
private float temperature;
private float humidity;
private float pressure;
public WeatherData()
{
observersList = new List<IObserver>();
}
public void RegisterObserver(IObserver obs)
{
observersList.Add(obs);
}
public void RemoveObserver(IObserver obs)
{
int index = observersList.IndexOf(obs);
if (index >= 0)
{
observersList.RemoveAt(index);
}
}
public void MeasurementsChanged()
{
Console.WriteLine("There is new data available...");
NotifyObservers();
}
public void NotifyObservers()
{
foreach (IObserver observer in observersList)
{
observer.Update(temperature, humidity, pressure);
}
}
public void SetMeasurements(float temperature, float humidity, float pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
MeasurementsChanged();
}
}
要在我的Program.cs中使用這些類,我instnce的WeatherData
創建一次,並且通過該對象作爲參數給CurrentConditionDisplay
的構造函數。我用這個當前設置看到的一個問題是IObserver
有一個方法Update
,它需要temperature, humidity, pressure
作爲參數。我不能保證Subject(WeatherData)必須首先擁有這些字段。我是否應該添加另一個接口或抽象基類,以確保在調用SetMeasurements
時,在該方法中更新的所有字段實際上都在Observer
?
僅供參考,C#有一個內置的實現觀察者模式。請參閱[事件](http://msdn.microsoft.com/en-us/library/awbftdfh.aspx) –
*您確定所有在該方法中更新的字段實際上都在Observer中,這意味着什麼* ?多次閱讀並且無法理解您的問題 –
@JohnSaunders這是一本關於設計模式的書。目標是瞭解觀察者的想法,而不是學習C#功能) –