这是一个关于ui的故事,ui需要在数值变化的情况下改变自己的显示,ui就是观察者,观察拥有这个hp值的被观察者,当hp改变,被观察者就需要通知观察者改变ui的显示了。
//抽象观察者 using UnityEngine; public class Observer : MonoBehaviour { public virtual void OnValueUpdate(int num) { } }
//抽象被观察者 public interface ISubject { void Attach(Observer o); void Detach(Observer o); void Notify(int num); }
//具体观察者 using UnityEngine.UI; public class HpObserver : Observer { public Text hpText; public override void OnValueUpdate(int num) { hpText.text = num.ToString(); } }
//具体被观察者 using System.Collections.Generic; public class HpSubject:ISubject { private List<Observer> list = new List<Observer>(); public void Attach(Observer o) { list.Add(o); } public void Detach(Observer o) { if (list.Contains(o)) { list.Remove(o); } } public void Notify(int num) { foreach (var i in list) { i.OnValueUpdate(num); } } }
//测试使用 using UnityEngine; public class testObserver : MonoBehaviour { void Start () { HpObserver hp = this.GetComponent<HpObserver>(); ISubject subject = new HpSubject(); subject.Attach(hp); subject.Notify(100); subject.Notify(30); } }
将事先准备好的观察者接口注册到被观察者中,这样被观察者数据发生改变后,就可以通知注册了的观察者发生相应的改变了。注册的行为最好在第三方那里同一管理,方便查找,减少耦合。