观察者模式
观察者模式适用于有多个对象,对象之间存在一对多的依赖关系。
被依赖的对象称为subject,依赖的对象成为Observer,subject通知Observer变化
举例
观察者模式就像顶牛奶业务
- 奶站,Subject
- 用户,Observer
Subject:登记注册、移除通知
![](https://img.haomeiwen.com/i11480296/e438b63dd8532646.png)
Observer:接收输入
![](https://img.haomeiwen.com/i11480296/4017cf9258cf32a4.png)
示例
![](https://img.haomeiwen.com/i11480296/62e4f0581880a2b3.png)
using System;
using System.Collections.Generic;
using System.Text;
namespace Observer
{
/// <summary>
/// 观察者接口
/// </summary>
interface Observer
{
void Update(float mTeperatrue,float mPressure,float mHumidity);
}
interface Subject
{
void RegisterObserver(Observer observer);
void RemoveObserver(Observer observer);
void NotifyObservers();
}
class CurrentConditions : Observer
{
private float mTeperatrue;
private float mPressure;
private float mHumidity;
//更新本地数据
public void Update(float mTeperatrue, float mPressure, float mHumidity)
{
this.mTeperatrue = mTeperatrue;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
Display();
}
//显示本地数据
public void Display()
{
Console.WriteLine("Tody mTeperatrue"+ mTeperatrue);
Console.WriteLine("Tody mPressure" + mPressure);
Console.WriteLine("Tody mHumidity" + mHumidity);
}
}
class ForcastConditions : Observer
{
private float mTeperatrue;
private float mPressure;
private float mHumidity;
public void Update(float mTeperatrue, float mPressure, float mHumidity)
{
this.mTeperatrue = mTeperatrue;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
Display();
}
public void Display()
{
Random rd = new Random();
Console.WriteLine("Tomorrow mTeperatrue" + mTeperatrue + rd.Next(1, 10));
Console.WriteLine("Tomorrow mPressure" + mPressure + rd.Next(1, 10));
Console.WriteLine("Tomorrow mHumidity" + mHumidity + rd.Next(1, 10));
}
}
class WeatherData:Subject
{
private float mTeperatrue;
private float mPressure;
private float mHumidity;
private List<Observer> myObservers;
public float MTeperatrue { get => mTeperatrue; }
public float MPressure { get => mPressure; }
public float MHumidity { get => mHumidity; }
public WeatherData()
{
myObservers = new List<Observer>();
}
public void SetData(float mTeperatrue, float mPressure,float mHumidity)
{
this.mTeperatrue = mTeperatrue;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
DataChange();
}
public void DataChange()
{
NotifyObservers();
}
public void NotifyObservers()
{
for (int i = 0; i < myObservers.Count; i++)
{
myObservers[i].Update(MTeperatrue, MPressure, MHumidity);
}
}
public void RegisterObserver(Observer observer)
{
myObservers.Add(observer);
}
public void RemoveObserver(Observer observer)
{
if (myObservers.Contains(observer))
myObservers.Remove(observer);
}
}
class Program
{
static void Main(string[] args)
{
CurrentConditions currentConditions = new CurrentConditions();
ForcastConditions forcastConditions = new ForcastConditions();
WeatherData weatherData=new WeatherData();
weatherData.RegisterObserver(currentConditions);
weatherData.RegisterObserver(forcastConditions);
weatherData.SetData(1, 2, 3);
}
}
}
网友评论