public class 观察者模式_20
{
//本质就是发布订阅形式.使用委托或者回调方式.
abstract class observer
{
public abstract void Update();
}
/// <summary>
/// 具体观察者.
/// </summary>
class ConcreteObserver : observer
{
private string name;
private string observerState;
private ConcreteSubject subjecte;
//意味着,我要关注这个对象.
public ConcreteObserver(ConcreteSubject subject, string name)
{
this.subjecte = subject;
this.name = name;
}
public override void Update()
{
observerState = this.subjecte.SubjecState;
Console.WriteLine($"观察者: {name} ; 被观察者状态: {observerState}");
}
public ConcreteSubject Subjec
{
get => this.subjecte;
set => this.subjecte = value;
}
}
abstract class subject
{
private IList<observer> observers = new List<observer>();
public void Attach(observer observerobj)
{
observers.Add(observerobj);
}
//移除观察者.
public void Detach(observer observerobj)
{
observers.Remove(observerobj);
}
public void Notify()
{
foreach (var item in observers)
{
item.Update();
}
}
}
/// <summary>
/// 具体通知者.将有关状态存入具体观察者对象.在具体主题的内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个具体子类实现
/// </summary>
class ConcreteSubject : subject
{
private string subjecstate;
//具体被观察者状态.
public string SubjecState
{
get => subjecstate;
set => subjecstate = value;
}
}
public static void TestData()
{
//被观察的对象.
ConsoleFormate.consoleFormate(() =>
{
ConcreteSubject concrete = new ConcreteSubject();
//添加两个关注的对象
concrete.Attach(new ConcreteObserver(concrete, "武汉"));
concrete.Attach(new ConcreteObserver(concrete, "上海"));
concrete.Attach(new ConcreteObserver(concrete, "深圳"));
concrete.SubjecState = "新冠状肺炎!!! ";
concrete.Notify();
}, @"观察者");
}
}