觀察者模式:
阿新 • • 發佈:2018-11-30
觀察者模式: 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()+"點就到了公司了"); } }