Unity【话大】设计模式之观察者模式

前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了

在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略



有说的不正确或者不准确的地方欢迎留言指正


有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力



7643202-ed2cb039ab8bf85d.png
7643202-66d7157a32bf7c80.png

Youtube、微博等社交媒体可能是大家生活中必不可少的东西,在遇到自己感兴趣的东西或者Up主总会忍不住关注一波,每当自己关注的UP主更新动态时,对应的关注者也会受到对应的更新推送,这样就不会错过感兴趣的第一手资料。这种模式在设计模式中也有类似的应用,那就是今天笔者要说的观察者模式

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

话不多少,示例走起、

首先定义一个类似于UP主、频道这种性质的接口

    public interface ISubject
    {
        void NotifyObservers();
        void RegisterObserver(IObserver observer);
    }

然后定义各位吃瓜群众的观察者接口

    public interface IObserver
    {
        void Update(string tag);
    }

Unity频道具体实现类

    public class UnitySubject : ISubject
    {
        private IList<IObserver> observerList = new List<IObserver>();

        private string tag = "";

        public string Tag
        {
            get { return tag; }
            set { tag = value; }
        }
        public void NotifyObservers()
        {
            for (int i = 0; i < observerList.Count; i++)
            {
                observerList[i].Update(tag);
            }
        }

        public void RegisterObserver(IObserver observer)
        {
            observerList.Add(observer);
        }
    }

各位吃瓜群众

    public class HaiLanZero : IObserver
    {
        public void Update(string tag)
        {
            this.Log($"{nameof(HaiLanZero)}---收到信息---{tag}");
        }
    }
    public class HaiLanOne : IObserver
    {
        public void Update(string tag)
        {
            this.Log($"{nameof(HaiLanOne)}---收到信息---{tag}");
        }
    }
    public class HaiLanTwo : IObserver
    {
        public void Update(string tag)
        {
            this.Log($"{nameof(HaiLanTwo)}---收到信息---{tag}");
        }
    }

调用

using ObserverPattern;
using UnityEngine;
public class ObserverComponent : MonoBehaviour
{


    void Start()
    {
        Initialized();
    }

    public void Initialized()
    {
        UnitySubject unitySubject = new UnitySubject();

        IObserver haiLanZero = new HaiLanZero();
        IObserver haiLanOne = new HaiLanOne();
        IObserver haiLanTwo = new HaiLanTwo();

        unitySubject.RegisterObserver(haiLanZero);
        unitySubject.RegisterObserver(haiLanOne);
        unitySubject.RegisterObserver(haiLanTwo);

        unitySubject.Tag = "Unity频道更新视频啦";
        unitySubject.NotifyObservers();
    }
}

这样我们只要属性已更新,就可以让订阅频道的吃瓜群众第一时间接收到信息了

在开发过程中,我们应该会更熟悉另一种实现方式,那就是事件啦,我们就先简单的改装下

7643202-ab1b0fc27fff369c.png
7643202-7773bc3ff948143b.png

笔者记得有一次开发中用到观察者模式是在界面刷新的时候,这个刷新界面有时候是更换字体、皮肤主题、或者对应的内容。只要点击应用,所有的打开的界面都会更换。
观察者模式在实际开发中应用的地方还是很广泛的,只要需求有一对多、能灵活的增减订阅,减少耦合度,都可以考虑使用观察者模式。

这里我们可以下思考一下

  • 根据参数Tag不同,我们是不是可以在对应的Observer实例里面采用不同的行为方式呢?
  • 如果这个Tag不是string,而是泛型或者object呢?参数范围扩大是不是让我们能做的事更多了呢 ?
  • 吃瓜群众对应的更新函数Update是不是也可以在多个Up主或者频道中订阅呢?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。它允许一个被观察的对象(称为主题或被观察者)维护一组依赖于它的对象列表(称为观察者),并在状态发生变化时自动通知观察者。 在Unity中,可以使用C#语言和相关的Unity API来实现观察者模式。下面是一个简单的示例: ```csharp // 定义观察者接口 public interface IObserver { void OnNotify(); } // 定义被观察者类 public class Subject { private List<IObserver> observers = new List<IObserver>(); public void AddObserver(IObserver observer) { observers.Add(observer); } public void RemoveObserver(IObserver observer) { observers.Remove(observer); } public void NotifyObservers() { foreach (var observer in observers) { observer.OnNotify(); } } } // 实现观察者类 public class Observer : IObserver { public void OnNotify() { // 处理通知的逻辑 } } // 使用观察者模式 public class Example : MonoBehaviour { private Subject subject = new Subject(); private Observer observer = new Observer(); private void Start() { subject.AddObserver(observer); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { subject.NotifyObservers(); } } } ``` 在上面的示例中,Subject类是被观察者,它维护了一个观察者列表。Observer类是观察者,它实现了IObserver接口的OnNotify方法来处理通知的逻辑。Example类演示了如何使用观察者模式,在Start方法中将观察者添加到被观察者的列表中,在Update方法中按下空格键时通知观察者。 这只是一个简单的例子,实际应用中可能会有更复杂的场景和逻辑。观察者模式Unity中的应用广泛,可以用于处理事件、消息传递、UI更新等各种情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值