C++ 慣用法之 Policy-based design
一、背景
Policy-based 是 C++ 的一種基于模板和繼承的設計方法。通過模板方式可以實現在編譯期給指定的類配置方法,而傳統的策略模式則是在運行期對類的方法進行動態配置。
所謂設計模式沒有一定不變的使用準則,同一個問題可以有多種模式來解決,采用有效的設計模式可以減少重復性代碼以及用最小的改動來應對變化。多了解一種模式,可以增加一種解決問題的思路。
二、Policy-based design
1.概述
該模式中的繼承是 implement-by 的關系,而非 Is-A 的關系,其重點是模板而非繼承。
2.問題描述
假設一個類提供一個對外的接口,但在不同的場景中有不同的實現方式,以下是一種常見的實現代碼:
class demoClass
{
public:
void func(int type)
{
//根據場景指定實現方式
switch (type)
{
case 1:
func1(); break;
case 2:
func2(); break;
case 3:
func3(); break;
default:
break;
}
}
private:
void func1() { cout << "used func1" << endl; }//不同的實現方式
void func2() { cout << "used func1" << endl; }
void func3() { cout << "used func1" << endl; }
};
在以上代碼中通過傳入一個標記參數 type 來實現不同的方法調用,當需要增加更多的實現方式時,需要在類的方法中增加相應的判斷代碼,對既有代碼進行修改意味著增加了出錯的可能。
3.使用 Policy-based
上述問題的解決可以有多種方式,本文記錄一下 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;
}
圖片