什么是Event Bus,可以百度一下这个关键词,了解一下。具体来说,好处有两点:
1.广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象
2.发布者与订阅者耦合性降低,发布者只管发布一条消息出去,它不关心这条消息如何被订阅者使用
Delphi 现在有了开源项目,https://www.github.com/spinettaro/delphi-event-bus,目前已经发展到2.0版本,我在项目中使用感觉非常强大与稳定,支持跨平台。接下来,假设你已经下载并安装到Delphi IDE中,看看如何使用他。
2.0版本改动非常大,较1.x比,简直是脱胎换骨,用法更简洁,但功能更灵活,因为完全基于接口来实现的。
为了使用他,首先呢,我们要声明一个接口,然后再用一个类来实现这个接口:
现在声明一个接口IMemoChangeEvent:
IMemoChangeEvent = interface ['{DCFE64D2-9BA8-4949-9BB1-F5CD672E51A2}'] procedure SetText(const Value: string); function GetText: String; property Text: string read GetText write SetText; end;
接着,用TMemoChangeEvent类来实现这个接口:
TMemoChangeEvent = class(TInterfacedObject, IMemoChangeEvent) private FText: string; procedure SetText(const Value: string); function GetText: String; public property Text: string read GetText write SetText; end;
我们再声明一个函数,将TMemoChangeEvent实列用接口IMemoChangeEvent返回:
function GetMemoEvent: IMemoChangeEvent; begin Result:= TMemoChangeEvent.Create; end;
现在,我们可以将这个接口,通过Event Bus发布出去了,下面是发布的代码:
procedure TfrmMain.Memo1Change(Sender: TObject); var LEvent: IMemoChangeEvent; begin LEvent := GetMemoEvent;//取得接口 LEvent.Text := Memo1.Lines.Text;//为接口赋值 GlobalEventBus.Post(LEvent);//发布接口实例 end;
上面的代码中,GlobalEventBus是Delphi Event Bus提供的一个全局函数,返回IEventBus接口实例。
接下来,看看如何接收这个IMemoChangeEvent接口实例,看下面的代码,我们在接收对象中这样声明一个方法:
[Subscribe] procedure OnMemoChange(AEvent: IMemoChangeEvent);
注意,这里用了注解[Subscribe],同时,接收方法只有一个参数AEvent,再看一下具体的实现:
procedure TfrmSecond.OnMemoChange(AEvent: IMemoChangeEvent); begin MemoObserver.Lines.Text := AEvent.Text; end;
这个AEvent参数就是前面发送的接口实例。
最后,为了能让接收对象接收消息,我们还要做一步,就是把接收对象注册到Event Bus中:
procedure TfrmSecond.FormCreate(Sender: TObject); begin GlobalEventBus.RegisterSubscriberForEvents(Self);//一般情况下,我们都是在对象建立时注册 end;
procedure TfrmSecond.FormDestroy(Sender: TObject); begin GlobalEventBus.UnregisterForEvents(Self);//取消注册 end;
现在,基于Delphi Event Bus的发布-订阅机制就完成了。
上文中用到的代码是开源代码中的例子VCLMessageing.dpr,你下载后就有了这个,可以基于上文,运行例子,感受Delphi Event Bus带给我们的便利!
如果上面内容对你有帮助,别忘记为我点赞或者关注,为我加点动力!