观察者模式实例

这是一个关于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);
	}
}


将事先准备好的观察者接口注册到被观察者中,这样被观察者数据发生改变后,就可以通知注册了的观察者发生相应的改变了。注册的行为最好在第三方那里同一管理,方便查找,减少耦合。


首页 我的博客
粤ICP备17103704号