Posted on 2009-02-11 01:46
Fox 閱讀(1961)
評論(2) 編輯 收藏 引用 所屬分類:
T技術(shù)碎語
在一個稍微上規(guī)模(怎么也有幾十個類吧)的C++程序中,繼承和組合的使用比比皆是。雖然GoF提出了OOD的兩個原則,第二個謂之『優(yōu)先使用對象組合,而不是繼承』,但這絕不意味著不使用繼承,正因如此,第一個原則才是『針對接口編程,而不是針對實現(xiàn)編程』,這兩個原則清楚的表達了軟件工程中『低耦合』的思想。
模板方法(Template Method)的意圖正是『定義一個操作中的算法的框架,而將一些步驟延遲到子類中』。
注意,這里有個關(guān)鍵詞『一些』,既然是『一些』,就意味著父類的的接口中已經(jīng)實現(xiàn)了『一些』步驟,否則,父類便只提供了抽象接口。
這一情況是我們在編碼時時常遇到的,父類實現(xiàn)了部分算法中的通用行為,子類根據(jù)自己的需求可對其進行必要擴充。
class CBase
{
public:
// Default done
virtual void Operation(void)
{
...
}
};
class CDerive :
public CBase
{
public:
virtual void Operation(void)
{
switch( ... )
{
case A: ...
case B: ...
case c: ...
default:
CBase::Operation();
}
}
};
因為對父類的不了解或是對子類的太了解,你以為CDerive::Operation()
做了足夠多,不需要CBase::Operation()
,但實際上仍然需要的情況總在發(fā)生。
換一種方式,把Operation()
作為模板方法,把DoOperation()
作為可擴展的接口提供給子類實現(xiàn):
class CBase
{
public:
void SetFocus(void) { ... }
void ResetFocus(void) { ... }
// Call by user
void Operation(void)
{
SetFocus();
DoOperation();
ResetFocus();
}
// Default done
virtual void DoOperation(void) = 0;
}; class CDerive :
public CBase
{
public:
virtual void DoOperation(void)
{
...
}
};
模板方法只是提供了一個簡單的封裝技巧,當(dāng)然不是所有的虛接口都這么寫:)。
更多內(nèi)容請移步我的個人主頁。