设计模式---观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决的问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
示例:Unity中的观察者模式
- 定义一个可观察类(Subject)
首先,我们需要定义一个包含事件的类,这个类将在某个状态发生变化时通知所有已注册的观察者。
C#
using System;
using UnityEngine;
public class GameEventPublisher : MonoBehaviour
{
public static GameEventPublisher Instance;
// 定义一个委托类型,用于声明事件
public delegate void GameEventHandler(string message);
// 声明一个事件,类型为上面定义的委托类型
public static event GameEventHandler OnGameEvent;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
// 模拟一个状态变化的方法
public void TriggerEvent(string message)
{
// 如果有订阅者,则触发事件
OnGameEvent?.Invoke(message);
}
}
- 创建观察者类(Observer)
接下来,我们创建一个或多个观察者类,这些类将监听并响应由GameEventPublisher发布的事件。
c#
using UnityEngine;
public class GameEventListener : MonoBehaviour
{
// 在Start方法中订阅事件
private void Start()
{
GameEventPublisher.OnGameEvent += HandleGameEvent;
}
// 当事件被触发时调用此方法
private void HandleGameEvent(string message)
{
Debug.Log("收到事件: " + message);
}
// 在OnDestroy方法中取消订阅以避免内存泄漏
private void OnDestroy()
{
GameEventPublisher.OnGameEvent -= HandleGameEvent;
}
}
- 触发事件
为了测试这个模式,你可以在你的游戏逻辑中某处调用TriggerEvent方法,例如通过用户输入、定时器或其他游戏事件触发。
c#
if (Input.GetKeyDown(KeyCode.Space))
{
gameEventPublisher.TriggerEvent("Space键被按下");
}
这样,当按下空格键时,GameEventPublisher会触发事件,所有订阅了OnGameEvent的观察者都会收到通知,并执行相应的操作(在这个例子中是打印一条消息到控制台)。
这种模式使得代码更加模块化和易于维护,因为它允许对象之间进行松散耦合的通信。通过使用事件和委托,你可以轻松地添加新的观察者,而无需修改现有的发布者代码。