观察者模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
public interface IOrchard
{
void Add(IMonitor monitor);//添加监控员接口方法
void Remove(IMonitor monitor);//移除监控员接口方法
void Notify();//通知监控员更新监控状态方法
}
//果园类
public class Orchard : IOrchard
{
private List<IMonitor> monitors = new List<IMonitor>();//监控员列表
public string State { get; set; }
//添加监控员
public void Add(IMonitor monitor)
{
monitors.Add(monitor);
}
//移除监控员
public void Remove(IMonitor monitor)
{
monitors.Remove(monitor);
}
public void Notify()
{
foreach (var item in monitors)
{
item.Update();
}
}
}
public interface IMonitor
{
void Update();//更新监督状态接口方法
}
//果园监控员
public class Monitor : IMonitor
{
private Orchard orchard;
private string name;
public Monitor(Orchard myClass, string Name)
{
this.orchard = myClass;
this.orchard.Add(this);//将自身添加到果园监控着列表
this.name = Name;
}
public void Update()
{
Console.WriteLine("{0}监控{1}", name, orchard.State);
}
}
class Program
{
static void Main(string[] args)
{
Orchard orchard = new Orchard();//创建果园实例
IMonitor bjMonitor = new Monitor(orchard, "北京果园监控员");//北京果园监控员
IMonitor shMonitor = new Monitor(orchard, "上海果园监控员");//上海果园监控员
orchard.State = "苹果园";//将果园监控状态改为苹果园
orchard.Notify();//通知监控员更新监控状态
Console.ReadKey();
}
}
}
代码分析:
本实例代码实现了观察者模式,首先创建了果园接口IOrchard及其派生类Orchard,然后创建了监控员接口IMonitor及其派生类Monitor,IOrchard接口主要提供了添加(Add)和删除(Remove)果园监控员及通知(Notify)果园监控员状态更新这三种接口方法,Orchard 类实现了这些接口,在Orchard类中保存了所有对果园进行监控的果园监控员列表,当Orchard的状态发生改变时将通知所有的果园监控员,调用Monitor类的Update方法,实现Monitor状态的同步更新。
说明:
观察者模式主要实现了对象间状态的一致性,当一个对象状态发生改变时,依赖该对象的对象都会得到状态变更的通知。