我是一个有用的助手,可以翻译文本。
我正在阅读《Head First 设计模式》这本(神奇的)书,并需要对观察者模式进行一些澄清。以下代码片段模拟了一个设备(CurrentConditionDisplay),该设备侦听天气模式的更新。
接口:
观察者模式
为了在 Program.cs 中使用这些类,我正在创建一个 WeatherData 实例,并将该对象作为参数传递给 CurrentConditionDisplay 构造函数。 我发现当前设置的一个问题是 IObserver 只有一个方法 Update,该方法以温度、湿度和压力作为参数。 我没有看到 Subject (WeatherData) 必须首先拥有这些字段的保证。 我应该添加另一个接口或抽象基类,以确保当调用 SetMeasurements 时,所有在该方法中更新的字段实际上都在 Observer 中吗?
我正在阅读《Head First 设计模式》这本(神奇的)书,并需要对观察者模式进行一些澄清。以下代码片段模拟了一个设备(CurrentConditionDisplay),该设备侦听天气模式的更新。
接口:
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 中使用这些类,我正在创建一个 WeatherData 实例,并将该对象作为参数传递给 CurrentConditionDisplay 构造函数。 我发现当前设置的一个问题是 IObserver 只有一个方法 Update,该方法以温度、湿度和压力作为参数。 我没有看到 Subject (WeatherData) 必须首先拥有这些字段的保证。 我应该添加另一个接口或抽象基类,以确保当调用 SetMeasurements 时,所有在该方法中更新的字段实际上都在 Observer 中吗?
WeatherData
没有将temperature, humidity, pressure
作为私有字段。观察者和主题没有共同的接口(来共享那些被更新的字段)。 - wootscootinboogieWeatherData
和CurrentConditionDisplay
都有温度、湿度和压力作为它们之间共同的私有字段。如果我从WeatherData
调用CurrentConditionDisplay
的Update方法,我是否需要一个基类或接口来说“嘿,我保证你更新的是你想要的内容?” - wootscootinboogie