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

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

  • 相关阅读:
    [北大机试C]:走迷宫(BFS)
    [北大机试B][OpenJ_Bailian-2965]:玛雅历(模拟)
    [北大机试A]:有趣的跳跃(模拟)
    [2019北大机试D]:最大上升子序列和(DP)[计蒜客-T1221/HDU1087]
    [牛客练习赛53] A.超越学姐爱字符串 [dp]
    [牛客][北大考研复试]I Wanna Go Home[dijkstra]
    SP1716 GSS3
    牛客小白月赛13_A_小A的签到题
    自习室管理系统,基于B/S模式下的JAVA系统
    基于SSH的聊天室
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/14495519.html
Copyright © 2020-2023  润新知