C++物件之間通訊的三種常見方式
經過這一年多對C++的使用,總結出了下邊的三種常見物件之間的通訊方式。這裡就不上程式碼了。只作為一種設計思想,記錄下來方便自已以後使用,和大家一起學習,這只是自已在工作中的總結,如果誰有更好的經驗,請回復我,我再加進去。
1:使用一個全域性單例物件作為互動物件的中介;
在這種互動方式中,有三個物件參加進來。
類1:ClassA; //用來建立互動物件1:obj1
類2:ClassB; //用來建立互動物件2:obj2
類3:ClassC; //單例類,用來建立單例物件:objS
如果obj1現在要給obj2傳送一條訊息,就要先從objS中取得obj2的物件指標地址。然後通過這個地址把訊息傳送給obj2。當然,用同樣的方法,我們也可以讓obj2給Obj1傳送訊息。
這裡使用時要注意的問題有兩個。
1) obj1給obj2傳送訊息時,objS中存的obj2物件地址不能為空
2) 當建立obj2時,要馬上把obj2的例項地址傳送給單例objS,在銷燬obj2時,要馬上把obj2在單例objS中儲存的物件地址清空為NULL
2:為互動的物件建立一個虛介面代理類;
這種方式,適合自已常常要給第三方發回調訊息的物件,比如按鈕或者控制元件什麼的。因為自已包含於目標物件,所以比較方便設定代理,也可以使用目標物件對控制元件物件對外組合封裝起來。
這種互動方式中,有兩個物件參加進來,建立類時,需要建立發訊息物件的虛代理類。在而目標物件要繼承這個虛代理類並實現這個代理類的虛方法。他和第三種方式相比,優點是可以建立多條訊息通道。
類1:ClassA; //用來建立互動類ClassC,將作為obj1的一個父類
類2:ClassB; //用來建立傳送訊息的物件2:obj2
虛介面類:ClassX; //用來實現互動,在obj2中會包含一個ClassX的例項型別變數。以方便儲存obj1的物件地址。
類3: ClassC; //繼承自ClassA和ClassX,用來建立互動物件1:obj1
3:建立互動物件的基類方法函式指標。
這種方式和第二種其實是差不多的,只是這種方式,比較適合只有一條回撥訊息的情況。這裡只有兩個物件,和一個物件方法函式指標。這裡只強調一下,物件函式指標的定義方式。
類1:ClassA; //用來建立互動物件1:obj1
類2:ClassB; //用來建立互動物件2:obj2
這裡說明一下obj1和obj2的方法函式指標都怎麼建立:
假如:
ClassA有一個物件方法,void func1(); 我們給這個方法定義一個指標型別如下
typedef void (ClassA::*FUNC1)();
在物件obj2中就可以定義這麼一個FUNC1型別的物件指標。定在建立obj1中建立obj2時把obj1的這個FUNC1的指標型別賦上obj1的回撥方法指標。這樣就可以在obj2中使用使用obj1的這個物件方法指標呼叫obj2的回撥方法了。 請看圖:
第一種方法最常用容易理解,第二方法速度快,第一種與三種結合適合批量物件互動,可組成MVC或觀察著模式。
UML圖畫的並不標準,正在學習中。
另外我有一個QQ群,歡迎愛技術的來一起學習交流:213571088