GoF中定義:
“在對象之間定義一個一對多的連接方法,當一個對象變換狀態時,其他關聯的對象都會自動收到通知。”
現實中,社交網絡就是個例子。
以前的報社,每次出新刊的時候,
報刊便會將新刊一本一本的送到訂閱報刊人的手中
於是,每次出新刊,報社都得送到每個人的手中
而如今的微博,便是應用了觀察者模式
當想關注某個人時,只需要點擊關注便可訂閱
當關注的人更新微博時,只需要更新到微博平台
訂閱的人就可以接收到更新的消息
而不需要被關注的那個人向每個訂閱者發送消息
C#中的事件系統(Event)便是使用的觀察者模式
Unity中的所有事件(如UI點擊事件)也是應用的觀察者模式
//事件接口 public abstract class Subject { List<Observer> m_Observers = new List<Observer>(); public void Attach(Observer theObserver) { m_Observers.Add(theObserver); } public void Detach(Observer theObserver) { m_Observers.Remove(theObserver); } public void Notify() { foreach (Observer theObserver in m_Observers) theObserver.Update(); } }
//實現事件 public class ConcreteSubject : Subject { string m_SubjectState; public void SetState(string state) { m_SubjectState = state; Notify(); } public string GetState() { return m_SubjectState; } }
//觀察者接口 public abstract class Observer { public abstract void Update(); }
//實現觀察者 public class ConcreteObserver : Observer { string m_SubjectState; ConcreteSubject m_Subject = null; public ConcreteObserver(ConcreteSubject theSubject){ m_Subject = theSubject; } public override void Update() { Debug.Log("ConcreteSubject.Update"); } }
//測試類 public class TestObserver { private void UnitTest() { ConcreteSubject theSubject = new ConcreteSubject(); ConcreteObserver theObserver = new ConcreteObserver(theSubject); theSubject.Attach(theObserver); theSubject.SetState("Subject狀態1"); } }
觀察者模式的設計原理是,先設置一個主題(Subject)
讓這個主題發布時可同時通知關心這個主題的觀察者/訂閱者
並且主題不必理會觀察者/訂閱者接下來會執行哪些操作
觀察者模式的主要功能和優點:
將“主題發生”與“功能執行”這兩個操作解除綁定
文章整理自書籍《設計模式與游戲完美開發》 菜升達 著