当对象间存在一对多关系时,推荐使用观察者模式。比如当一个对象被修改时,则会自动通知它的以来对象。观察者模式属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象的状态发生改变时,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关于在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按钮,效果图如下: