红鱼儿

Delphi Event Bus入门

什么是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带给我们的便利!

如果上面内容对你有帮助,别忘记为我点赞或者关注,为我加点动力!

posted on 2021-03-07 17:43  红鱼儿  阅读(1913)  评论(1编辑  收藏  举报