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

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

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



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


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



Unity【话大】设计模式之观察者模式_第1张图片

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 observerList = new List();

        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();
    }
}

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

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

Unity【话大】设计模式之观察者模式_第2张图片
Unity【话大】设计模式之观察者模式_第3张图片

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

这里我们可以下思考一下

  • 根据参数Tag不同,我们是不是可以在对应的Observer实例里面采用不同的行为方式呢?
  • 如果这个Tag不是string,而是泛型或者object呢?参数范围扩大是不是让我们能做的事更多了呢 ?
  • 吃瓜群众对应的更新函数Update是不是也可以在多个Up主或者频道中订阅呢?

你可能感兴趣的:(Unity【话大】设计模式之观察者模式)