一、场景:有一个气象站,检测气象后发布气象信息,有3个观察者会接受气象的发布信息。
二、普通的处理方式:
三、观察者模式处理方式:
OO原则:为交互对象之间的松耦合设计而努力。(这个是第四条,后续还有几条)
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
详细代码关系图与代码如下。
/// <summary>
/// 主题,规定发布者遵行的行为
/// </summary>
public interface ISubject
{
/// <summary>
/// 注册
/// </summary>
/// <param name="observer">观察者</param>
void Register(IObserver observer);
/// <summary>
/// 注销,退出
/// </summary>
/// <param name="observer">观察者</param>
void Logout(IObserver observer);
/// <summary>
/// 通知
/// </summary>
/// <param name="info">消息内容</param>
void Notify(object info);
}
/// <summary>
/// 观察者,规定订阅者遵行的行为
/// </summary>
public interface IObserver
{
/// <summary>
/// 更新
/// </summary>
/// <param name="info">要更新的信息</param>
void Update(object info);
}
/// <summary>
/// 气象数据主题
/// </summary>
public class WeatherData : ISubject
{
private List<IObserver> observerList = new List<IObserver>();
/// <summary>
/// 数据变更状态
/// </summary>
public bool Status { get; private set; }
public Scene Info { get; set; }
public void Register(IObserver observer)
{
observerList.Add(observer);
}
public void Logout(IObserver observer)
{
observerList.Remove(observer);
}
public void Notify(object info)
{
if (!Status)
{
return;
}
foreach (IObserver observer in observerList)
{
observer.Update(info);
}
Status = false;
}
public void SetChanged()
{
Status = true;
Notify(Info);
}
}
/// <summary>
/// 场景、环境
/// </summary>
public struct Scene
{
/// <summary>
/// 温度
/// </summary>
public float Temperature { get; set; }
/// <summary>
/// 湿度
/// </summary>
public float Humidity { get; set; }
/// <summary>
/// 压力
/// </summary>
public float Pressure { get; set; }
public override string ToString()
{
return string.Format("温度:{0},湿度:{1},压力:{2}", Temperature, Humidity, Pressure);
}
}
public class Observer1 : IObserver
{
public Observer1(ISubject subject)
{
subject.Register(this);
}
public void Update(object info)
{
Console.WriteLine("我是1号观察者(张三),当前信息 {0}", info);
}
}
public class Observer2 : IObserver
{
public Observer2(ISubject subject)
{
subject.Register(this);
}
public void Update(object info)
{
Console.WriteLine("我是2号观察者(李四),当前信息 {0}", info);
}
}
public class Observer3 : IObserver
{
public Observer3(ISubject subject)
{
subject.Register(this);
}
public void Update(object info)
{
Console.WriteLine("我是3号观察者(王五),当前信息 {0}", info);
}
}
//测试代码
[Test]
public void WeatherStation()
{
WeatherData weather = new WeatherData();
Observer1 observer1 = new Observer1(weather);
Observer2 observer2 = new Observer2(weather);
Observer3 observer3 = new Observer3(weather);
Scene scene = new Scene() { Humidity = 26f, Temperature = 33f, Pressure = 29.2f };
weather.Info = scene;
weather.SetChanged();
scene.Temperature = 31.5f;
scene.Humidity = 28.2f;
weather.Info = scene;
weather.SetChanged();
}