观察者模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
/// <summary>
/// 观察者
/// </summary>
public interface ObServer
{
/// <summary>
/// 当气象观测值改变时,主题会把这些状态值当作方法的参数,传送给观察者,所有的观察者都必须实现update()方法,以实现观测者接口,在这里我们按照mary 和sue的想法把观测值传入观察者中。
/// </summary>
/// <param name="temp"></param>
/// <param name="humidity"></param>
/// <param name="pressure"></param>
void update(float temp, float humidity, float pressure);
}
}
DisplayElement
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
/// <summary>
/// dispaly Element 接口值包含一了一个方法,也就是display (),当公告板需要显示时,调用此方法。
/// </summary>
public interface DisplayElement
{
void Display();
}
}
主题
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
/// <summary>
/// 主题
/// </summary>
public interface Subject
{
/// <summary>
/// 这两个方法都需要一个观察者作为变量,该观察者是用来注册或被删除的。
/// </summary>
/// <param name="o"></param>
void registerObserver(ObServer o);
/// <summary>
/// 移除观察者
/// </summary>
/// <param name="o"></param>
void removeObserver(ObServer o);
/// <summary>
/// 当主题状态改变时,这个方法会被调用,以通知所有的观察者
/// </summary>
void notifyObservers();
}
}
主题的实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace JackYong.Observer
{
/// <summary>
/// weatherData 实现了subject接口
/// </summary>
public class WeatherData : Subject
{
/// <summary>
/// 加上ArrayList来记录观察者,此ArrayList是在构造器中建立的。
/// </summary>
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData()
{
observers = new ArrayList();
}
/// <summary>
/// 注册
/// </summary>
/// <param name="o"></param>
public void registerObserver(ObServer o)
{
observers.Add(o);
}
/// <summary>
/// 移除
/// </summary>
/// <param name="o"></param>
public void removeObserver(ObServer o)
{
int i = observers.IndexOf(o);
if (i >= 0)
{
observers.Remove(i);
}
}
/// <summary>
/// 通知
/// </summary>
public void notifyObservers()
{
for (int i = 0; i < observers.Count; i++)
{
ObServer observer = (ObServer)observers[i];
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged()
{
notifyObservers();
}
/// <summary>
/// 当气候改变后调用
/// </summary>
/// <param name="temperature"></param>
/// <param name="humidity"></param>
/// <param name="pressure"></param>
public void setMeasurements(float temperature, float humidity, float pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
}
统计量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
/// <summary>
/// 统计
/// </summary>
public class StatisticsDisplay : ObServer, DisplayElement
{
private float temperature;
private float humidity;
private Subject weatherData;
public StatisticsDisplay(Subject weatherData)
{
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure)
{
this.temperature = temp;
this.humidity = humidity;
//更新完毕后 显示
Display();
}
public void Display()
{
Console.WriteLine("current coditions :" + temperature + " F degrees and " + humidity + "% humidity");
}
}
}
当前
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
public class CurrentConditionsDisplay:ObServer,DisplayElement
{
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData)
{
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure)
{
this.temperature = temp;
this.humidity = humidity;
//更新完毕后 显示
Display();
}
public void Display()
{
Console.WriteLine("current coditions :" + temperature + " F degrees and " + humidity + "% humidity");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Observer
{
class Program
{
static void Main(string[] args)
{
WeatherData weatherdata = new WeatherData();
CurrentConditionsDisplay currentdisplay = new CurrentConditionsDisplay(weatherdata);
StatisticsDisplay statistics = new StatisticsDisplay(weatherdata);
weatherdata.setMeasurements(80, 65, 30.4f);
weatherdata.setMeasurements(82, 70, 29.2f);
weatherdata.setMeasurements(78, 90, 29.2f);
}
}
}
出处:http://www.cnblogs.com/liuyong/
作者喜欢研究 Sql Server ,ASP.NET MVC , Jquery WCF 等技术,同时关心分布式架构的设计应用。转载请保留原文链接,谢谢!
浙公网安备 33010602011771号