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. 观察者只能被动的获取数据,并不能主动的获取到想要的数据。
  • 相关阅读:
    IXmlSerializable With WCFData Transfer in Service Contracts
    Difference Between XmlSerialization and BinarySerialization
    Using XmlSerializer (using Attributes like XmlElement , XmlAttribute etc ) Data Transfer in Service Contracts
    Introducing XML Serialization
    Version Tolerant Serialization
    Which binding is bestWCF Bindings
    Data Transfer in Service Contracts
    DataContract KnownTypeData Transfer in Service Contracts
    Using the Message ClassData Transfer in Service Contracts
    DataContract POCO SupportData Transfer in Service Contracts
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11740874.html
Copyright © 2011-2022 走看看