模块(类)之间解耦利器:EventPublishSubscribeUtils 事件发布订阅工具类

Java81

如果熟悉C#语言的小伙伴们一般都会知道委托、事件的好处,只需在某个类中提前定义好公开的委托或事件(委托的特殊表现形式)变量,然后在其它类中就可以很随意的订阅该委托或事件,当委托或事件被触发执行时,会自动通知所有的订阅者进行消费处理。(观察者模式用委托来实现是最好不过了,DDD所提倡的事件驱动其根本理念也是如此),当然我这里想到的是不需要在每个类中进行定义委托或事件,而是由一个统一的中介者(即EventPublishSubscribeUtils)来提供事件的订阅及发布操作,这样各模块之间无需直接依赖,只需通过中介者完成发布通知与订阅回调即可,何乐而不为呢?

这里我先借助C#语言独有的委托类型快速实现了一个简易的EventPublishSubscribeUtils,代码如下:

```c#
///
/// 自定义事件发布订阅回调工具类(业务解藕、关注点分离,避免互相依赖)--演示版
/// EventBus简化版,观察者模式
/// author:zuowenjun
///
public static class EventPublishSubscribeUtils
{
private static ConcurrentDictionary> EventHandlers { get; } = new ConcurrentDictionary>();

    private static void removeRegisters(ref EventHandler srcEvents, EventHandler removeTargetEvents)
    {
        var evtTypes = removeTargetEvents.GetInvocationList().Select(d => d.GetType());
        var registeredEventHandlers = Delegate.Combine(srcEvents.GetInvocationList().Where(ei => evtTypes.Contains(ei.GetType())).ToArray());
        srcEvents -= (EventHandler)registeredEventHandlers;
    }
输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长