C++ 慣用法之 Policy-based design
一、背景
Policy-based 是 C++ 的一種基于模板和繼承的設(shè)計(jì)方法。通過(guò)模板方式可以實(shí)現(xiàn)在編譯期給指定的類配置方法,而傳統(tǒng)的策略模式則是在運(yùn)行期對(duì)類的方法進(jìn)行動(dòng)態(tài)配置。
所謂設(shè)計(jì)模式?jīng)]有一定不變的使用準(zhǔn)則,同一個(gè)問(wèn)題可以有多種模式來(lái)解決,采用有效的設(shè)計(jì)模式可以減少重復(fù)性代碼以及用最小的改動(dòng)來(lái)應(yīng)對(duì)變化。多了解一種模式,可以增加一種解決問(wèn)題的思路。
二、Policy-based design
1.概述
該模式中的繼承是 implement-by 的關(guān)系,而非 Is-A 的關(guān)系,其重點(diǎn)是模板而非繼承。
2.問(wèn)題描述
假設(shè)一個(gè)類提供一個(gè)對(duì)外的接口,但在不同的場(chǎng)景中有不同的實(shí)現(xiàn)方式,以下是一種常見的實(shí)現(xiàn)代碼:
class demoClass
{
public:
void func(int type)
{
//根據(jù)場(chǎng)景指定實(shí)現(xiàn)方式
switch (type)
{
case 1:
func1(); break;
case 2:
func2(); break;
case 3:
func3(); break;
default:
break;
}
}
private:
void func1() { cout << "used func1" << endl; }//不同的實(shí)現(xiàn)方式
void func2() { cout << "used func1" << endl; }
void func3() { cout << "used func1" << endl; }
};
在以上代碼中通過(guò)傳入一個(gè)標(biāo)記參數(shù) type 來(lái)實(shí)現(xiàn)不同的方法調(diào)用,當(dāng)需要增加更多的實(shí)現(xiàn)方式時(shí),需要在類的方法中增加相應(yīng)的判斷代碼,對(duì)既有代碼進(jìn)行修改意味著增加了出錯(cuò)的可能。
3.使用 Policy-based
上述問(wèn)題的解決可以有多種方式,本文記錄一下 Policy-based design 方式。
template<typename T>
class demoClass:public T
{
};
class func_policy1
{
public:
void func() { cout << "used func1" << endl; }
};
class func_policy2
{
public:
void func() { cout << "used func2" << endl; }
};
int main()
{
demoClass<func_policy1> demo;
demo.func();
system("pause");
return 0;
}
圖片