zoukankan      html  css  js  c++  java
  • 【Unity与23种设计模式】观察者模式(Observer)

    GoF中定义:

    “在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。”

    现实中,社交网络就是个例子。

    以前的报社,每次出新刊的时候,

    报刊便会将新刊一本一本的送到订阅报刊人的手中

    于是,每次出新刊,报社都得送到每个人的手中

    而如今的微博,便是应用了观察者模式

    当想关注某个人时,只需要点击关注便可订阅

    当关注的人更新微博时,只需要更新到微博平台

    订阅的人就可以接收到更新的消息

    而不需要被关注的那个人向每个订阅者发送消息

    C#中的事件系统(Event)便是使用的观察者模式

    Unity中的所有事件(如UI点击事件)也是应用的观察者模式

    //事件接口
    public abstract class Subject {
        List<Observer> m_Observers = new List<Observer>();
    
        public void Attach(Observer theObserver) {
            m_Observers.Add(theObserver);
        }
    
        public void Detach(Observer theObserver) {
            m_Observers.Remove(theObserver);
        }
    
        public void Notify() {
            foreach (Observer theObserver in m_Observers)
                theObserver.Update();
        }
    }
    //实现事件
    public class ConcreteSubject : Subject {
        string m_SubjectState;
    
        public void SetState(string state) {
            m_SubjectState = state;
            Notify();
        }
    
        public string GetState() {
            return m_SubjectState;
        }
    }
    //观察者接口
    public abstract class Observer {
        public abstract void Update();
    }
    //实现观察者
    public class ConcreteObserver : Observer {
        string m_SubjectState;
    
        ConcreteSubject m_Subject = null;
    
        public ConcreteObserver(ConcreteSubject theSubject){
            m_Subject = theSubject;
        }
    
        public override void Update()
        {
            Debug.Log("ConcreteSubject.Update");
        }
    }
    //测试类
    public class TestObserver {
        private void UnitTest() {
            ConcreteSubject theSubject = new ConcreteSubject();
    
            ConcreteObserver theObserver = new ConcreteObserver(theSubject);
            theSubject.Attach(theObserver);
    
            theSubject.SetState("Subject状态1");
        }
    }

    观察者模式的设计原理是,先设置一个主题(Subject)

    让这个主题发布时可同时通知关心这个主题的观察者/订阅者

    并且主题不必理会观察者/订阅者接下来会执行哪些操作

    观察者模式的主要功能和优点:

    将“主题发生”与“功能执行”这两个操作解除绑定

    文章整理自书籍《设计模式与游戏完美开发》 菜升达 著

  • 相关阅读:
    VUe兄弟通信
    vue组件之间的通信, 父子组件通信,兄弟组件通信
    js 数组 map方法
    vue生命周期
    使用JQuery获取被选中的checkbox的value值
    C#中struct和class的区别详解 (转载)
    C# 增加时间的三个方法
    c# 事件3
    C# 事件2
    C# 事件
  • 原文地址:https://www.cnblogs.com/fws94/p/7453043.html
Copyright © 2011-2022 走看看