【设计模式】轻松了解观察者模式

本文介绍了观察者模式的概念,通过对比非观察者模式,展示了观察者模式在游戏暂停功能中的高效实现,降低了代码耦合度,提高了代码可维护性。文章详细阐述了如何使用观察者模式,并总结了其在优化代码结构和方便后期修改方面的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

当我们项目中的代码越来越多时,就会出现一些复杂程度上或是代码逻辑上的问题,这时候就需要用一些固定的解决方案来帮助我们解决问题。这些解决方案不仅可以解决代码框架结构的问题,而且可以很好的降低代码之间的耦合度。这些解决方案就是设计模式。而观察者模式就是设计模式中的一种。


一、啥子是观察者模式?

观察者模式定义了一个一对多的依赖关系,让多个观察者监听同一个主体对象,当主体对象发生变化时,会通知所有的观察者,使观察者可以自己进行更新。

二、注意看!这有个非观察者与观察者的对比!

在游戏开发过程中,我们不可避免的要考虑到游戏的暂停功能,而且游戏的暂停功能要同时对游戏内的所有对象起效,下面我们就模拟游戏的暂停功能。

以下是两种方式的实现。

非观察者模式代码

让我们来瞅瞅非观察者模式的代码

using UnityEngine;

public class Boss
{
    public void Stop()
    {
        Debug.Log("我是Boss, 我已暂停");
    }
}-
public class Npc
{
    public void Stop()
    {
        Debug.Log("我是Npc, 我已暂停");
    }
}
public class Gamer
{
    public void Stop()
    {
        Debug.Log("我是玩家, 我已暂停");
    }
}
public class Observer : MonoBehaviour
{
    Boss boss;
    Npc npc;
    Gamer gamer;
    void Start()
    {
        boss = new Boss();
        npc = new Npc();
        gamer = new Gamer();
    }
    void Update()
    {
        //单击鼠标左键,让每个类暂停
        if (Input.GetMouseButtonDown(0))
        {
            boss.Stop();
            npc.Stop();
            gamer.Stop();
        }
    }

}

在上段代码中,当我们点击鼠标左键的时候,都会主动调用每个对象的暂停方法,然我们想象一下,一个游戏内有多少对象?100?1000?难道我们每次都得主动调用成百上千的对象中的方法?这还还是一处,如果我们要多处调用呢?由此可见,使用这种方式的话,调用方法的代码量就成倍增加了。

观察者模式代码

为了避免上述情况, 我们的观察者模式就来了!

using UnityEngine;
using System.Collections.Generic;

public interface Character
{
    void Stop();
}
public class Boss : Character
{
    public void Stop()
    {
        Debug.Log("我是Boss, 我已暂停");
    }
}
public class Npc : Character
{
    public void Stop()
    {
        Debug.Log("我是Npc, 我已暂停");
    }
}
public class Gamer : Character
{
    public void Stop()
    {
        Debug.Log("我是玩家, 我已暂停");
    }
}

//定义一个被观察的对象
public class ObservedSubject

{
    public List<Character> chatacters = new List<Character>();

    //添加观察者
    public void AddOb(Character theC)
    {
        chatacters.Add(theC);
    }

    public void RemoveOb(Character theC)
    {
        chatacters.Remove(theC);
    }

    public void RunOb()
    {
        foreach (Character theC in chatacters)
        {
            theC.Stop();
        }
    }
}
public class Observer : MonoBehaviour
{
    ObservedSubject observerSubject;

    void Start()
    {
        observerSubject = new ObservedSubject();

        observerSubject.AddOb(new Boss());
        observerSubject.AddOb(new Npc());
        observerSubject.AddOb(new Gamer());
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            observerSubject.RunOb();
        }
    }
}

对于被观察的主体来说,它只负责发消息,并不知道谁接收消息,谁执行什么方法;而对于观察者来说,则只会监听消息,没消息不会调用任何事件,如果有消息就调用对应事件,不用在意是谁发的消息。这样我们就降低了代码的耦合性,对优化代码的整体框架都有帮助,也便于后期修改。

三、如何使用观察者模式

使用观察者模式的大概思路为下:

1:创建一个观察者的接口 (上文中的 Character 接口)
2:创建多个观察者类并继承观察者接口(上文中的Boss, Npc, Gamer类继承了Character)
3:创建一个被观察的主体(上文中的 observerSubject 类)
4:在满足对应条件下通过被观察主体向观察者发消息,使观察者调用对应方法。


总结

合理的使用观察者模式,可以有效降低我们代码的耦合性,同时也有利于后期进行修改!(本篇文章若有错误,欢迎指正!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值