设计模式-观察者模式

事件机制系统
一、简易版
1、 概述
  有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
2.、解决的问题
  将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
3.、模式中的角色
(1) 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
(2) 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
(3) 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
(4) 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
而且还能学到C#中委托,事件的用法,接口,抽象类的知识。

//==========================
// - FileName:      PrefabConst.cs         
// - Created:       true.	
// - CreateTime:    2020/02/27 22:43:01	
// - Email:         1670328571@qq.com		
// - Region:        China WUHAN	
// - Description:   
//==========================
————————————————
版权声明:本文为CSDN博主「true-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhanxxiao/article/details/104535851
public static class PrefabConst
{
    //注册事件名称
    public const string bullet = "**";
}
//==========================
// - FileName:      EventCall.cs         
// - Created:       true.	
// - CreateTime:    2020/02/27 22:43:01	
// - Email:         1670328571@qq.com		
// - 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	
// - Email:         1670328571@qq.com		
// - 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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值