您的位置:首页 > 其它

观察者模式(又叫发布-订阅模式)

2016-04-08 10:30 295 查看
原理:

        定义对象间的一种一对多依赖关系,使得每当一个对象(通知者)状态发生改变时,其相关依赖对象(观察者)皆得到通知并被自动更新



//通知者接口
interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState
{
get;
set;
}
}

class Secretary : Subject//秘书作为通知者
{
//同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
//增加
public void Attach(Observer observer)
{
observers.Add(observer);
}
//减少
public void Detach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach (Observer o in observers)
o.Update();
}
//前台状态
public string SubjectState
{
get { return action; }
set { action = value; }
}
}

class Boss : Subject//老板作为通知者
{
//同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
//增加
public void Attach(Observer observer)
{
observers.Add(observer);
}
//减少
public void Detach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach (Observer o in observers)
o.Update();
}
//老板状态
public string SubjectState
{
get { return action; }
set { action = value; }
}
}

//抽象观察者
abstract class Observer
{
protected string name;
protected Secretary sub;

public Observer(string name, Secretary sub)
{
this.name = name;
this.sub = sub;
}

public abstract void Update();
}

//看股票的同事
class StockObserver : Observer
{
public StockObserver(string name, Secretary sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SecretaryAction, name);
}
}

//看NBA的同事
class NBAObserver : Observer
{
public NBAObserver(string name, Secretary sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SecretaryAction, name);
}
}

static void Main(string[] args)
{
//老板胡汉三
Boss huhansan = new Boss();

//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);

huhansan.Attach(tongshi1);
huhansan.Attach(tongshi2);

huhansan.Detach(tongshi1);

//老板回来
huhansan.SubjectState = "我胡汉三回来了!";
//发出通知
huhansan.Notify();

Console.Read();
}


实际过程中,用户界面可以作为一个观察者(可以有多个),业务数据可以是通知者(可以有多个),用户界面观察业务数据的变化,当发现数据变化时,就显示在界面上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: