原创 設計模式(4) - Builder模式

問題描述 一個複雜對象由不同的子部件構成,依據不同的上下文,該複雜對象的子部件可能有不同的具體類型(從用戶來看,該複雜對象有不同的外在表現)。如何通過一個相同的構造過程,產生這種不同的複雜對象?也可以說:如何隔離對象的構造過程和對象的具體

原创 設計模式(5) - 單件模式

問題描述 某些類型(例如前面介紹的工廠類)在一個系統中只能出現一份實例。《More Effective C++》條款26詳細的討論一些可能的方法。那麼,單件模式給我們帶來了什麼呢? 單件模式 如圖所示,單件模式提供的解決方案是:讓類自己保

原创 設計模式(3) - 原型模式

問題描述 無論工廠方法模式,或者是抽象工廠模式,客戶端程序在創建一個對象的時候,都依賴於一個具體的工廠類。本質上來說,客戶程序和這些具體的工廠類緊緊的綁死了。但是,某些程序(例如框架程序)可能無法訪問這些具體的工廠類,也可能需要一種動態的

原创 設計模式 (7) - Flyweight/享元模式

問題描述 一個系統中可能創建某類型的大量實例,有什麼方法可以節約內存開銷呢? 享元模式 如圖所示,享元模式劃分對象的內部狀態和外部狀態,外部狀態和對象的運行上下文相關;把外部狀態封裝成爲對象的接口參數傳遞到對象的方法調用中。對象方法依據對

原创 設計模式(1) - 工廠方法

問題描述 一個接口(如下圖的Product)可能有多種實現方式。程序邏輯在實例化這種類型/接口的具體類(如下圖的ConcreteProduct)的時候,如果直接使用{new ConcreteProduct()}的方式來撰寫;當需求變更的時

原创 設計模式(6) - 創建型模式總結

創建對象最直接的方法就是利用C++提供的構造函數,這種方法的缺點是讓代碼綁定了具體的類型;一旦該具體類型需要被替換爲新的類型,那麼程序邏輯就不得不修改;更糟糕的是,可能需要到處修改這樣的代碼。Open/Close原則的一個要旨是要避免這種

原创 設計模式(2) - 抽象工廠

問題描述 一個系統通常由多個相互關聯的類/接口構成。如果這些相關類/接口存在不同版本的實現方式,如何保證這些不同版本的相關類能夠配套工作?當然可以用硬編碼的方式來保證,但是當這些相關類數目衆多,引用方式龐雜,硬編碼的方式並不容易,也不方便

原创 設計模式(16) - 狀態模式

問題描述 存在某個對象的方法,其行爲模式依賴於對象的內部狀態;這些內部狀態更可能影響多個對象方法。這些對象方法的代碼結構通常是:依據不同的內部狀態,執行不同的操作。這種狀態判斷分散在多個方法中,損傷了代碼的可理解性和可維護性。狀態模式把這

原创 在MSYS2和MinGW-W64編譯GCC6.3

嘗試自己動手在Windows上編譯GCC6.3。以前瞭解過Cygwin和MinGW,這兩個工具是Windows上編譯Linux程序的典型配置。但是這些工具都古老了,這裏嘗試使用MSYS2 + MinGW-W64結合來編譯GCC6.3。本人

原创 輸出編譯器預處理器的中間文件

問題描述 這幾天在嘗試閱讀一些OpenJDK的源代碼,但是發現Source Insight工具無法跳轉到某些些函數,類型的定義上去。例如: JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv

原创 設計模式(25) - 行爲型模式總結

行爲型模式關注於對象之間在行爲方面的交互。可以從如下角度來解析各種行爲模式: 和對象狀態更新相關的模式 備忘錄模式關注於對象狀態的備份與恢復,但不破壞對象的封裝性。Memento由對象自行創建,由客戶保持;客戶在需要的時候利用 Memen

原创 設計模式(23) - 命令模式

問題描述 一個消息的發送者對象向消息的接收者發送消息,發送者如果保持接收者的信息,即可完成消息的投遞。但是這種方式把消息的發送者和接收者直接綁定在一起,讓消息的發送者依賴於消息的接收者。命令模式解除了消息發送者對於消息接收者的依賴。 命令

原创 設計模式(24) - 中介者模式

問題描述 在一個系統中存在多個實體對象,這些實體對象之間存在交互關係。例如:實體A狀態更新會導致實體B自動得到更新,並依據實體A的變化採取相應的動作。把實體對象之間的交互關心設計到每個實體對象中,會引入實體類之間的依賴關係,從而限制了實體

原创 設計模式(22) - 訪問者模式

 問題描述 集合的節點元素類型相對穩定,但是,在遍歷集合各個節點元素的時候,針對不同類型節點元素的訪問操作各不相同;並且將來更可能會添加新的訪問操作。如果把這些訪問操作實現成節點元素的方法,那麼這種訪問方

原创 設計模式 (11) - 適配器模式

問題描述 爲了重用一個已經存在的模塊,但是接口不兼容,如何讓兩個功能相似但是接口不兼容的代碼能夠一起工作呢? 適配器模式 適配器模式提出兩種方式來適配兩個不兼容的接口:類適配器採用多重繼承的方式,用一個接口來實現另外一個接口;對象適配器則