这是一个关于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);
}
}将事先准备好的观察者接口注册到被观察者中,这样被观察者数据发生改变后,就可以通知注册了的观察者发生相应的改变了。注册的行为最好在第三方那里同一管理,方便查找,减少耦合。