圖形表示,實心菱形
這里queue功能完全由deque包裝實現,是adapter設計模式。
內存大小如下
構造由內而外 Container的構造函數首先調用Component的默認構造函數,然后才執行自己。 實際上編譯器類似如下操作: Container::Container(...): Component() { ... };
析構由外而內 Container的析構函數首先執行自己,然后才調用Component的析構函數。 Container::~Container(...) {... ~Component( );}
其中包含一個指針。用空心菱形塊表示。
很有名 Handle/Body pimpl: pointer to implementation
所有的實現都在右邊,通過指針實現。好處是右邊的任何變動不影響左邊。編譯防火墻。
如果內容一樣可以共享,使用引用計數器。其中一個的寫不能影響其他的。
子類指向父類,空心三角形。
base class 的 dtor 必須是 virtual, 否則會出現undefined behavior
構造由內而外,析構由外而內 Derived::Derived(...) : Base( ) {...};
Derived::~Derived(...) { ... ~Base( ) };
繼承的函數實際上是繼承的函數調用權。
non-vitual 函數:你不希望derived class重新定義(override,復寫)它。 virtual 函數:你希望derived class重新定義(override,復寫)它,且你對它已有默認定義。 pure virtual 函數:你希望derived class一定要重新定義(override,復寫)它,你對它沒有默認定義。
Template Method
這里Serialize( )函數可以放到以后寫。MFC就是這樣。。。 Serialize使用this來調用。
作業 看看誰先誰后
可以做到類似如下效果
Subject里放的都是指針,其余從Observer繼承。 Subject提供注冊和注銷的函數,注冊即放到容器里。
Composite Composite容器 即要放PRimitive 又要放 Composite,于是讓Primitive和Composite均繼承Component。
add函數不能寫純虛函數,因為Primitive沒有add,繼承下來空函數。
Prototype 應對以后出現的新類,讓下面派生的子類都創建一個自己。
圖中下劃線代表靜態,- 代表private #代表protected,名字在前,類型在后。 子類里有一個靜態的自己,如_LSAT。 子類構造函數私有,將自己add到父類的容器中。 子類自己有clone函數,new 自己。 有兩個構造函數,當clone時,同樣會創建自己,調用構造函數,如果只有一個構造函數,那么又會把自己add到父類的容器中,所以寫一個帶參數的構造函數,這個參數根本用不到。
新聞熱點
疑難解答
圖片精選