设计模式---观察者模式

设计模式---观察者模式

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

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

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

示例:Unity中的观察者模式
  1. 定义一个可观察类(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);
    }
}
  1. 创建观察者类(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;
    }
}
  1. 触发事件

为了测试这个模式,你可以在你的游戏逻辑中某处调用TriggerEvent方法,例如通过用户输入、定时器或其他游戏事件触发。

c# 复制代码
if (Input.GetKeyDown(KeyCode.Space))
{
    gameEventPublisher.TriggerEvent("Space键被按下");
}

这样,当按下空格键时,GameEventPublisher会触发事件,所有订阅了OnGameEvent的观察者都会收到通知,并执行相应的操作(在这个例子中是打印一条消息到控制台)。
这种模式使得代码更加模块化和易于维护,因为它允许对象之间进行松散耦合的通信。通过使用事件和委托,你可以轻松地添加新的观察者,而无需修改现有的发布者代码。

相关推荐
yj爆裂鼓手4 小时前
spine绑定骨骼运动工具&spine纹理压缩自动设置工具
游戏·unity
惊鸿醉8 小时前
Unity 实战:用讯飞 WebAPI 做一个“说普通话、播方言“的语音程序
unity·c#·游戏引擎·语音识别
略略略咯咯9 小时前
C#Unity
开发语言·unity·c#
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
用户2022522150614 小时前
字节发布"豆包工作",我从AI PM角度看到的不是功能,是上下文
设计模式
小贺儿开发14 小时前
Unity 局域网遥控幻灯片展示工具 1.0
unity·网络通信·工具·ppt·控制·网页·互动
AI人工智能+电脑小能手15 小时前
大白话说Java设计模式-37-中介者模式(源码剖析篇)
java·设计模式·线程池·中介者模式·源码分析·executor·applicationeventmulticaster
电子科技圈17 小时前
IAR与东软睿驰达成战略合作,强化软件开发效率与生态协作
设计模式·开源·软件工程·软件构建·代码规范·设计规范·代码复审
吴声子夜歌18 小时前
Java面试——设计模式(四)
java·设计模式·面试
WarPigs19 小时前
Unity未激活的物体无法响应事件?
java·unity·游戏引擎