• Unity---游戏设计模式(15)之观察者模式





    参考于:https://blog.csdn.net/colinandroid/article/details/81113013
    《设计模式HeadFirst》

    观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。

    设计原则1:为了交互对象之间的松耦合设计而努力。
    被观察者继承一个接口,这个接口包括:添加观察者、移除观察者、通知观察者触发事件。
    观察者继承一个接口,这个接口有个方法Update,在被观察者状态改变通知观察者时,调用的就是这个方法。观察者还要获取到被观察者的接口,用于注册,取消注册之类的事。

    1、观察者模式原型

    观察者模式原型UML

    观察者模式原型代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ObserverMode : MonoBehaviour
    {
        private void Start () {
    
            ConcreteSubjectA subjectA = new ConcreteSubjectA();
    
            IObserver observerA = new ConcreteObserverA(subjectA);
            IObserver observerB = new ConcreteObserverB(subjectA);
            subjectA.AddObserber(observerA);
            subjectA.AddObserber(observerB);
    
            //改变subjectA的状态
            subjectA.State = "状态A";
    	}
    }
    
    /// <summary>
    /// 被观察者抽象类
    /// </summary>
    public abstract class ISubject
    {
        /// <summary>
        /// 所有观察这个被观察者的   观察者集合
        /// </summary>
        protected List<IObserver> mObserverList;
    
        public ISubject()
        {
            mObserverList = new List<IObserver>();
        }
    
        /// <summary>
        /// 添加观察者
        /// </summary>
        public void AddObserber(IObserver observer)
        {
            if (mObserverList.Contains(observer) == false && observer != null)
            {
                mObserverList.Add(observer);
                return;
            }
            Debug.Log("报错");
        }
        /// <summary>
        /// 移除观察者
        /// </summary>
        public void RemoveObserber(IObserver observer)
        {
            if (mObserverList.Contains(observer))
            {
                mObserverList.Remove(observer);
                return;
            }
            Debug.Log("报错");
        }
        /// <summary>
        /// 通知所有观察者更新
        /// </summary>
        public void NotifyObserver()
        {
            foreach (IObserver item in mObserverList)
            {
                item.Update();
            }
        }
    }
    public class ConcreteSubjectA:ISubject
    {
        private string mState;
        public string State
        {
            get { return mState; }
            set {
                mState = value;
                NotifyObserver();
            }
        }
    }
    
    /// <summary>
    /// 观察者抽象类
    /// </summary>
    public abstract class IObserver
    {
        public abstract void Update();
    }
    public class ConcreteObserverA : IObserver
    {
        private ConcreteSubjectA mSubject;
    
        public ConcreteObserverA(ConcreteSubjectA subject)
        {
            mSubject = subject;
        }
    
        public override void Update()
        {
            Debug.Log("ConcreteObserverA显示更新:" + mSubject.State);
        }
    }
    public class ConcreteObserverB : IObserver
    {
        private ConcreteSubjectA mSubject;
    
        public ConcreteObserverB(ConcreteSubjectA subject)
        {
            mSubject = subject;
        }
    
        public override void Update()
        {
            Debug.Log("ConcreteObserverB显示更新:" + mSubject.State);
        }
    }
    

    2、观察者模式实例

    游戏应用:成就系统。
    例如成就要要检测敌人死亡个数。
    被观察者就是敌人死亡,观察者就是成就系统。当敌人死亡个数大过一定值时,会触发成就系统中的成就。

    3、观察者模式优缺点

    优点

    1. 降低耦合度。
    2. 满足开闭原则。

    缺点

    1. 大家都可以来注册并获取被观察者的数据,有可能会不安全。
    2. 观察者只能被动的获取数据,并不能主动的获取到想要的数据。
  • 相关阅读:
    图片自适应浏览器窗口宽度——就是响应式图片等比缩放效果
    iconfont.cn阿里巴巴矢量图下载字体图标实战
    layer.layui.com 一个不错的弹窗层js插件库
    自定义浏览器滚动条的样式,打造属于你的滚动条风格——兼容IE和webkit(ff不支持)
    css3实战版的点击列表项产生水波纹动画——之jsoop面向对象封装版
    css3实战版的点击列表项产生水波纹动画
    一个简单版的波纹css3动画
    CSS3动画效果——js调用css动画属性并回调处理详解
    CSS3 :target伪类实现Tab切换效果 BY commy
    css :active伪类的理解
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11740874.html
Copyright © 2020-2023  润新知