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