游戏设计模式——观察者模式(Observer)

tech2025-12-12  0

观察者模式

定义: 在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。 社交网站就会最佳的观察者模式实例。当我们在社交网站上,与另一位用户成为好友、加入一个粉丝团或关注另一位用户的状态, 那么当这些好友、粉丝团、用户有任何的新的动态或动态变动时,就会在我们动态页面上“主动”看到这些对象更新的情况, 而不必到每一位好友或粉丝团中查看。

观察者模式的优点

观察者的设计原理是,先设置一个主题,让这个主题发布时可同时通知关心这个主题的观察者/订阅者,并且主题不必理会观察者/订阅者,接下来会执行哪些操作。其优点就是将 主题发生 和 功能执行 这两个操作解除绑定——消除依赖性,而且对于“执行者(观察者/订阅者)”来说,还是可以动态决定是否要执行后续的功能。

观察者模式的缺点

可能造成过多的观察者类,不过利用注册“回调函数”来取代“注册类对象”可有效减少累的产生。

下面是栗子🌰

using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Leon_Observer { //观察者界面 public abstract class Leon_Observer { public abstract void Update(); } //主题界面 public abstract class Subject { List<Leon_Observer> m_Observers = new List<Leon_Observer>(); //加入观察者 public void Attach(Leon_Observer theObserver) { m_Observers.Add(theObserver); } //移除观察者 public void Detach(Leon_Observer theObserver) { m_Observers.Remove(theObserver); } //通知所有观察者 public void Notify() { foreach (Leon_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; } } //实际操作的Observer1 public class ConcreteObserver1 : Leon_Observer { string m_ObjectState; ConcreteSubject m_Subject = null; public ConcreteObserver1(ConcreteSubject theSubject) { m_Subject = theSubject; } //通知Subject更新 public override void Update() { Debug.Log("ConcreteObserver1.Update"); //取得Subject状态 m_ObjectState = m_Subject.GetState(); } public void ShowState() { Debug.Log("ConcreteObserver1:Subject目前的主题:" + m_ObjectState); } } //实际操作的Observer2 public class ConcreteObserver2 : Leon_Observer { ConcreteSubject m_Subject = null; public ConcreteObserver2(ConcreteSubject theSubject) { m_Subject = theSubject; } //通知Subject更新 public override void Update() { Debug.Log("ConcreteObserver2.Update"); //取得Subject状态 Debug.Log("ConcreteObserver2:Subject目前的主题:" + m_Subject.GetState()); } } } using Leon_Observer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Leon_ObserverTest : MonoBehaviour { // Start is called before the first frame update void Start() { UnitTest(); } private void UnitTest() { //主题 ConcreteSubject theSubject = new ConcreteSubject(); //加入观察者 ConcreteObserver1 theObserver1 = new ConcreteObserver1(theSubject); theSubject.Attach(theObserver1); theSubject.Attach(new ConcreteObserver2(theSubject)); //设定Subject theSubject.SetState("Subject状态1"); //显示状态 theObserver1.ShowState(); } }
最新回复(0)