2016/08/10
這篇提到的做法已經被我捨棄了,物件之間有依賴關係時,使用 std::shared_ptr 處理就已經很理想了。
在開發ToyBox途中,我設計了一個簡單的設計模式,用來解決我擔心的某種資源洩漏狀況。
很多情況下,兩個物件可能在資源上有依賴關係,需要互相保持聯絡,注意對方手上的資源是否還存在,當其中一方被銷毀或者打算切斷關係時,有必要通知對方一聲,讓對方可以處理一下(不要說一直到打了電話才知道這個人已經切斷關係),這可以避免許多記憶體問題,算是一種制式化的觀察者模式,只觀察對方是否打算斷絕聯絡,彼此互相觀察。
實作上就只是互相記住對方的指標,然後準備好一個callback function,上面紀錄當對方斷線時該如何應對,當對方斷線時就會由對方呼叫這個callback function。
實作寫在 ToyBox/include/toy/Link.hpp,大概要用一段時間才知道這作法的優缺點,有可能到頭來我只發現這作法是多此一舉也說不定,如果你對這個模式有什麼更好的建議,歡迎留言或來信告知。
#include <stdio.h>
#include "toy/Link.hpp"
//當 obj_B 主動絕交時會呼叫這個 obj_A 預先準備的行為
void obj_A_reaction()
{
printf("goodbye obj_B\n");
}
//這範例是 obj_A 先斷交的,所以只有執行這個
void obj_B_reaction()
{
printf("goodbye obj_A\n");
}
int main()
{
toy::Link obj_A;
toy::Link obj_B;
obj_A.SetReaction(&obj_A_reaction);
obj_B.SetReaction(&obj_B_reaction);
obj_A.Connect(obj_B); //兩者連結上了
obj_A.Disconnect(); //由obj_A主動斷交,此時只會呼叫obj_B_reaction()
return 0;
}
沒有留言:
張貼留言