美文网首页Unity Come On
Unity【话大】设计模式之观察者模式

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

作者: su9257_海澜 | 来源:发表于2018-12-09 03:41 被阅读96次

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

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



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


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



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

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

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

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

    这里我们可以下思考一下

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

    相关文章

      网友评论

        本文标题:Unity【话大】设计模式之观察者模式

        本文链接:https://www.haomeiwen.com/subject/zwdqhqtx.html