當對象之間存在一對多的關係時,若需要進行對象之間的通知,則可使用觀察者模式 介紹 觀察者模式屬於行為型模式,當一個對象的狀態發生改變時,若我們想通知其他對象,此時可通過觀察者模式來進行解決。 類圖描述 代碼實現 1、定義抽象觀察者 2、定義觀察者管理類 3、定義具體觀察者 4、上層調用 總結 觀察者 ...
當對象之間存在一對多的關係時,若需要進行對象之間的通知,則可使用觀察者模式
介紹
觀察者模式屬於行為型模式,當一個對象的狀態發生改變時,若我們想通知其他對象,此時可通過觀察者模式來進行解決。
類圖描述
代碼實現
1、定義抽象觀察者
public abstract class Observer
{
protected Subject subject;
public abstract void Update();
}
2、定義觀察者管理類
public class Subject
{
private List<Observer> observers = new List<Observer>();
private int state;
public int GetState() => this.state;
public void SetState(int state)
{
this.state = state;
NitifyAllObservers();
}
public void Attach(Observer observer)
{
observers.Add(observer);
}
private void NitifyAllObservers()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}
3、定義具體觀察者
public class BinaryObserver : Observer
{
public BinaryObserver(Subject subject)
{
this.subject = subject;
this.subject.Attach(this);
}
public override void Update()
{
Console.WriteLine($"Binary string:{subject.GetState()}");
}
}
public class HexaObserver:Observer
{
public HexaObserver(Subject subject)
{
this.subject = subject;
this.subject.Attach(this);
}
public override void Update()
{
Console.WriteLine($"Hex string:{subject.GetState()}");
}
}
public class OctalObserver:Observer
{
public OctalObserver(Subject subject)
{
this.subject = subject;
this.subject.Attach(this);
}
public override void Update()
{
Console.WriteLine($"Octal string:{subject.GetState()}");
}
}
4、上層調用
class Program
{
static void Main(string[] args)
{
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
Console.WriteLine("First state change:15");
subject.SetState(15);
Console.WriteLine("Second state change:10");
subject.SetState(10);
Console.ReadKey();
}
}
總結
觀察者模式通過一種集合方式將所有觀察者管理起來,並最終迴圈遍歷通知所有對象。