[cpp]
// 模板方法模式, 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
// 模板方法使得子類可以不改變一個算法的結構既可沖定義該算法的某些特定步驟。
// 問1:和泛型編程區別?
// 問2:感覺用策略模式也可以啊?
// 答1:泛型編程改變的是數據類型,模板方法一個改變的是自定義的實現細節。
// 答2:模板方法模式更後一層,為算法的實現細節,而策略模式是針對幾種算法。
#include "stdafx.h"
// 函數模板
template<typename T>
int Compare(const T &v1, const T &v2)
{
if (v1 < v2)
{
return -1;
}
else if (v1 > v2)
{
return 1;
}
else
return 0;
}
// 類模板
template<class Type>
class CCompare
{
public:
CCompare(const Type & v1, const Type & v2)
{
m_tFirst = v1;
m_tSecond = v2;
}
~CCompare(){;}
//template<class Type>
int Compare()
{
if (m_tFirst < m_tSecond)
{
return -1;
}
else if (m_tFirst > m_tSecond)
{
return 1;
}
else
return 0;
}
private:
Type m_tFirst;
Type m_tSecond;
};
//模板方法
class Bill
{
public:
virtual void AddCondition() = 0;
void Pay()
{
AddCondition();
printf("You need pay $100!\n");
}
protected:
private:
};
class MaleBill : public Bill
{
public:
void AddCondition()
{
printf("Sir!\n");
}
protected:
private:
};
class FemaleBill : public Bill
{
public:
void AddCondition()
{
printf("Lady!\n");
}
protected:
private:
};
// 測試函數
void TestTemplateFunc()
{
int result;
result = Compare(2.3, 3.1);
result = Compare(1, 2);
}
void TestTemplateClass()
{
int result;
CCompare<double> cp(2.3, 3.1);
result = cp.Compare();
CCompare<int> cp1(1, 2);
result = cp1.Compare();
}
void TestTemplateMethod()
{
Bill *pMale = new MaleBill;
pMale->Pay();
Bill *pFemale = new FemaleBill;
pFemale->Pay();
if (pMale)
{
delete pMale;
pMale = NULL;
}
if (pFemale)
{
delete pFemale;
pFemale = NULL;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//測試模板函數
TestTemplateFunc();
//測試模板類
TestTemplateClass();
//測試模板方法
TestTemplateMethod();
return 0;
}