什么是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帶給我們的便利!
如果上面內容對你有幫助,別忘記為我點贊或者關注,為我加點動力!