设计模式-观察者模式
原创
©著作权归作者所有:来自51CTO博客作者A武汉创品科的原创作品,请联系作者获取转载授权,否则将追究法律责任
事件机制系统
一、简易版
1、 概述
有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
2.、解决的问题
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
3.、模式中的角色
(1) 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
(2) 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
(3) 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
(4) 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
而且还能学到C#中委托,事件的用法,接口,抽象类的知识。
//==========================
// - FileName: PrefabConst.cs
// - Created: true.
// - CreateTime: 2020/02/27 22:43:01
//
// - Region: China WUHAN
// - Description:
//==========================
————————————————
public static class PrefabConst
{
//注册事件名称
public const string bullet = "**";
}
//==========================
// - FileName: EventCall.cs
// - Created: true.
// - CreateTime: 2020/02/27 22:43:01
/
// - Region: China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//委托类型
public delegate void CallObj(object obj);
//==========================
// - FileName: EventManager.cs
// - Created: true.
// - CreateTime: 2020/02/27 22:43:01
// - Region: China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventManager
{
private static EventManager _ins;
public static EventManager getIns()
{
if (_ins == null)
{
_ins = new EventManager();
}
return _ins;
}
Dictionary<string, CallObj> callDic = new Dictionary<string, CallObj>();
/// <summary>
/// 添加监听
/// </summary>
/// <param name="cmdStr">需要监听的指令</param>
/// <param name="_fun">指令触发后要执行的方法</param>
public void addEvent(string cmdStr, CallObj _fun)
{
//Debug.Log("添加了一个事件");
//如果字典中没有相对应的键值
if (!callDic.ContainsKey(cmdStr))
{
//添加一个键值方法
callDic.Add(cmdStr, _fun);
}
else
{
//如果字典里面有这个方法,就再绑定一个方法
callDic[cmdStr] += _fun;
}
}
/// <summary>
/// 触发指令
/// </summary>
/// <param name="cmdStr"></param>
/// <param name="obj"></param>
public void excute(string cmdStr, object obj = null)
{
//如果字典里面有这个指令
if(callDic.ContainsKey(cmdStr))
{
callDic[cmdStr](obj);
//或者写成
//CallObj _fun = callDic[cmdStr];
//_fun(obj);
}
else
//字典里面没有指令的时候
{
Debug.Log(callDic + "没有这个指令");
}
}
public void RemoveEvent(string cmdStr, CallObj _fun)
{
if (callDic.ContainsKey(cmdStr))
{
//移除一个键值方法
callDic[cmdStr] -= _fun;
}
else
{
Debug.Log("移除失败");
return;
}
}
}