zoukankan      html  css  js  c++  java
  • 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. 观察者只能被动的获取数据,并不能主动的获取到想要的数据。
  • 相关阅读:
    (算法)Hanoi Problem汉诺塔问题
    (剑指Offer)面试题48:不能被继承的类
    (剑指Offer)面试题47:不用加减乘除做加法
    (剑指Offer)面试题46:求1+2+3+....+n
    (剑指Offer)面试题45:圆圈中最后剩下的数字
    程序员应该知道的15件事 在生活与工作中用他们来警惕自己
    基于REST架构的Web Service设计
    互联网上五个最高级的搜索引擎
    哈佛经济学家关于工作效率的意外发现
    列举一些常见的系统系能瓶颈 Common Bottlenecks
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11740874.html
Copyright © 2011-2022 走看看