问题描述
公司几个同时上班摸鱼,比如又看NBA的,有炒股的。如果老板回来了,前台小妹会给大家发消息,大家立刻开始工作。
代码实现
Subject接口
public interface Subject
{
void attach(Observer observer);
void detach(Observer observer);
void notify();
string GetSubjectState();
}
订阅者抽象类
public abstract class Observer
{
protected string mName;
protected Subject mSub;
public Observer(string name, Subject sub)
{
mName = name;
mSub = sub;
}
public abstract void update();
}
具体Subject类
public class Boss : Subject
{
private List<Observer>mObservers = new List<Observer>();
private string action;
public void attach(Observer observer)
{
mObservers.Add(observer);
}
public void detach(Observer observer)
{
mObservers.Remove(observer);
}
public string GetSubjectState()
{
return action;
}
public void notify()
{
foreach(var observer in mObservers)
observer.update();
}
public void SetSubjectState(string state)
{
this.action = state;
}
}
订阅者实现类
public class NBAObserver : Observer
{
public NBAObserver(string name, Subject subject) : base(name, subject) { }
public override void update()
{
Console.WriteLine($"{mSub.GetSubjectState()} {mName} 关闭直播,开始工作");
}
}
public class StockObserver : Observer
{
public StockObserver(string name, Subject sub) : base(name, sub)
{
}
public override void update()
{
Console.WriteLine($"{mSub.GetSubjectState()} {mName} 关闭股票行情,开始工作");
}
}
运行结果
老板回来了 职工2 关闭股票行情,开始工作
UML图
疑问点:
为什么Subject的接口attach、detach、notify暴露在外?这样的话,Observer的Subject 成员也可以调用这些接口。但是实际上Observer的Subject成员不应该调用这些接口。