【Unity與23種設計模式】觀察者模式(Observer)


 

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)

讓這個主題發布時可同時通知關心這個主題的觀察者/訂閱者

並且主題不必理會觀察者/訂閱者接下來會執行哪些操作

 

觀察者模式的主要功能和優點:

將“主題發生”與“功能執行”這兩個操作解除綁定

 

 

文章整理自書籍《設計模式與游戲完美開發》 菜升達 著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM