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帶給我們的便利!

如果上面內容對你有幫助,別忘記為我點贊或者關注,為我加點動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM