1. 程式人生 > >觀察者模式:

觀察者模式:

觀察者模式:



using System.Collections;

using System.Collections.Generic;

using UnityEngine;


//委託就是那方法作為引數傳遞

public delegate void OnActionHandler(params object[] parm);

public class guanchazhemoshi : MonoBehaviour

{

       public static guanchazhemoshi instance;

       public Dictionary<ushort, List<OnActionHandler>> dict = new Dictionary<ushort, List<OnActionHandler>>();

       private void Start()

       {

              instance = this;

       }

       /// <summary>

       /// 新增

       /// </summary>

       /// <param name="shortID"></param>

       /// <param name="handhelder"></param>

       public void AddeventListener(ushort shortID, OnActionHandler handhelder)

       {//一個鍵對應一個委託集合,集合裡都對應的鍵,   有這個鍵的話,往他的委託集合裡再新增一個委託方法

              if (dict.ContainsKey(shortID))

              {//給這個鍵新增在委託集合裡對應的委託

                     dict[shortID].Add(handhelder);

              }

              else

              {//new出來新增進去

                     List<OnActionHandler> handhelderlist = new List<OnActionHandler>();

                     handhelderlist.Add(handhelder);

                     //鍵等於集合裡的handhelder

                     dict[shortID] = handhelderlist;//???

              }

       }

       // 刪掉這個鍵對應的一個方法    一個鍵可能對應很多的委託方法

       public void RemoveAction(ushort shortID, OnActionHandler handhelder)

       {

              if (dict.ContainsKey(shortID))

              {//跟據鍵找到   在集合委託中對應方法的集合所有的

                     List<OnActionHandler> handhelderlist = dict[shortID];

                     //刪掉這個委託方法      刪掉這個鍵對應的一個方法

                     handhelderlist.Remove(handhelder);

                     //在集合委託中對應方法的集合所有的==0  這個鍵就沒有存在的必要

                     if (handhelderlist.Count==0)

                     {

                           dict.Remove(shortID);

                     }

              }

              

       }

       public void DisPath(ushort shortID, params object[] parm)

       {

              if (dict.ContainsKey(shortID))

              {

                     //獲取該id所對應的所有方法列表

                     List<OnActionHandler> handlerlist = dict[shortID];

                           if (handlerlist != null&& handlerlist.Count>0)

                           {

                                  for (int i = 0; i < handlerlist.Count; i++)

                                  {

                                         if (handlerlist[i]!=null)

                                         {

                                         //呼叫  鍵對應的委託方法  傳入引數

                                                handlerlist[i](parm);

                                         }

                                  }

                           }

              }

       }

}

被觀察類



using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class xiaoming : MonoBehaviour {

       public static xiaoming instance;

       

       void Start () {

              instance = this;

       }

       

       

       void Update () {

              if (Input.GetKeyUp(KeyCode.Q))

              {//           

                     guanchazhemoshi.instance.DisPath(1, 9);

              }

              if (Input.GetKeyUp(KeyCode.W))

              {

                     guanchazhemoshi.instance.DisPath(2,17);

              }

       }

}


觀察類



using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Boss : MonoBehaviour {

       // 老闆觀察

       void Start () {

              guanchazhemoshi.instance.AddeventListener(1, qq);

       }

       private void qq(object[] parm)

       {//引數傳遞的第0 個

              Debug.Log(parm[0].ToString()+"點就到了公司了");

       }

}