观察者,被观察实时数据推送给观察者
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Observer
{
interface Subject
{
void register(Observer o);
void remove(Observer o);
void notify();
}
interface Observer
{
void update(float temp);
}
interface Dispaly
{
void display();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Observer
{
/// <summary>
/// 可被观察的数据,里面有观察者列表
/// </summary>
class DataClass : Subject
{
//观察者列表
private List<Observer> observers;
//被实时观察的温度
private float temp;
public DataClass()
{
observers = new List<Observer>();
}
//添加观察者
public void register(Observer o)
{
observers.Add(o);
}
//删除观察者
public void remove(Observer o)
{
//或者:
//
//int i = observers.IndexOf(o);
//if (i > 0)
//{
// observers.RemoveAt(i);
//}
observers.Remove(o);
}
//提醒观察者进行数据更新
public void notify()
{
for (int i = 0; i < observers.Count; i++)
{
Observer o = (Observer)observers[i];
o.update(temp);
}
}
/// <summary>
/// 改变数值,并提醒观察者进行数据更新
/// </summary>
public void setValue(float temp)
{
this.temp = temp;
notify();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Observer
{
/// <summary>
/// 观察者之一
/// </summary>
class FirstDisplay : Observer,Dispaly
{
private float temp;
//被观察的数据作为成员变量
private Subject subjectData;
public FirstDisplay(Subject s)
{
this.subjectData = s;
//最重要的一句,为可被观察数据注册观察者
subjectData.register(this);
}
public void update(float temp)
{
this.temp = temp;
display();
}
/// <summary>
/// 观察者之一的显示方式
/// </summary>
public void display()
{
System.Console.Out.WriteLine("当前数值:" + temp);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Observer
{
class OtherDisplay:Observer,Dispaly
{
private float temp;
private Subject subjectData;
public OtherDisplay(Subject s)
{
this.subjectData = s;
subjectData.register(this);
}
public void update(float temp)
{
this.temp = temp;
display();
}
public void display()
{
System.Console.Out.WriteLine("当前数值指数:" + temp*2);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Observer
{
class Program
{
static void Main(string[] args)
{
DataClass data = new DataClass();
FirstDisplay f = new FirstDisplay(data);
OtherDisplay o = new OtherDisplay(data);
data.setValue(80);
data.setValue(99);
System.Console.ReadLine();
}
}
}