軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可復用物件導向軟體的基礎》(dp)兩本書。本文介紹原型模式和模板方法模式的實現。首先介紹原型模式,然後引出模板方法模式。
dp書上的定義為:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。其中有乙個詞很重要,那就是拷貝。可以說,拷貝是原型模式的精髓所在。舉個現實中的例子來介紹原型模式。找工作的時候,我們需要準備簡歷。假設沒有列印裝置,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷,如果要修改簡歷中的某項,那麼所有已寫好的簡歷都要修改,工作量很大。隨著科技的進步,出現了列印裝置。我們只需手寫乙份,然後利用列印裝置影印多份即可。如果要修改簡歷中的某項,那麼修改原始的版本就可以了,然後再影印。原始的那份手寫稿相當於是乙個原型,有了它,就可以通過影印(拷貝)創造出更多的新簡歷。這就是原型模式的基本思想。下面給出原型模式的uml圖,以剛才那個例子為例項。
原型模式實現的關鍵就是實現clone函式,對於c++來說,其實就是拷貝建構函式,需實現深拷貝,下面給出一種實現。
view plain
print?
//父類
class
resume
virtual
~resume() {}
virtual
resume* clone()
virtual
void
set(
char
*n) {}
virtual
void
show() {}
};
view plain
print?
class
resumea :
public
resume
; resumea::resumea(const
char
*str)
else
} resumea::~resumea()
resumea::resumea(const
resumea &r)
resumea* resumea::clone()
void
resumea::show()
這裡只給出了resumea的實現,resumeb的實現類似。使用的方式如下:
view plain
print?
intmain()
最近有個招聘會,可以帶上簡歷去應聘了。但是,其中有一家公司不接受簡歷,而是給應聘者發了一張簡歷表,上面有基本資訊、教育背景、工作經歷等欄,讓應聘者按照要求填寫完整。每個人拿到這份**後,就開始填寫。如果用程式實現這個過程,該如何做呢?一種方案就是用模板方法模式:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。我們的例子中,操作就是填寫簡歷這一過程,我們可以在父類中定義操作的演算法骨架,而具體的實現由子類完成。下面給出它的uml圖。
其中fillresume() 定義了操作的骨架,依次呼叫子類實現的函式。相當於每個人填寫簡歷的實際過程。接著給出相應的c++**。
view plain
print?
//簡歷
class
resume
virtual
void
seteducation() {}
virtual
void
setworkexp() {}
public
: void
fillresume()
};
class
resumea:
public
resume
; class
resumeb:
public
resume
;
使用方式如下:
view plain
print?
intmain()
設計模式C 實現(5) 原型模式 模板方法模式
分類 軟體設計模式c 實現 2011 08 11 08 38 15人閱讀收藏 舉報 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式...
設計模式C 實現(5) 原型模式 模板方法模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...
設計模式C 實現(5) 原型模式 模板方法模式
dp書上的定義為 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。其中有乙個詞很重要,那就是拷貝。可以說,拷貝是原型模式的精髓所在。舉個現實中的例子來介紹原型模式。找工作的時候,我們需要準備簡歷。假設沒有列印裝置,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷,如果要修改簡歷...