Unity设计模式之观察者模式

当对象间存在一对多关系时,推荐使用观察者模式。比如当一个对象被修改时,则会自动通知它的以来对象。观察者模式属于行为型模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象的状态发生改变时,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关于在Unity中的使用:使用C#中的事件委托Delegate来彻底解除通知者和观察者之间的耦合

委托:委托是一种函数指针。一旦为委托分配了方法,委托将与该方法有相同的行为。委托方法可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数(方法)的抽象,是特殊的“函数类”,委托的实例代表一个(或者多个)具体的函数,他可以是多路广播的。

实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

//声明委托
public delegate void ObserverBttton();
/// <summary>
/// 具体被观察类
/// </summary>
public class Observer : MonoBehaviour {

    //创建委托
    public static ObserverBttton ObserverEvent;
    Button btn;

	void Start () {
        btn = GetComponent<Button>();
        //当有按钮点击行为时,发送事件
        btn.onClick.AddListener(() =>
        {
            if (ObserverEvent != null)
            {
                ObserverEvent();
            }
        });
	}

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 具体的观察者
/// </summary>
public class TextSubject : MonoBehaviour {

    Text txt;
	void Start () {
        //注册事件
        Observer.ObserverEvent += Change;
        txt = GetComponent<Text>();
	}

    void Change()
    {
        txt.text = "监控按钮发生点击事件";
    }

    private void OnDestroy()
    {
        //销毁事件
        Observer.ObserverEvent -= Change;
    }
}

将被观察者脚本赋值给Button,将观察者脚本复制给Text,

运行后,点击Button按钮,效果图如下:

猜你喜欢

转载自blog.csdn.net/qq_38721111/article/details/86668041