模板方法模式
注:
開始寫出的最簡單的類的代碼中,找到類似的代碼,進行泛化,從而抽象爲接口類。
如果用了繼承,並肯定這個繼承有意義,就應該要成爲子類的模板,所有重複的代碼都應該要上升到父類去,而不是讓每個子類都去重複。
1. 模板方法模式:
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
2. 模板方法模式的特點:
是可以通過把不變行爲搬移到超類去,去除子類中的重複代碼來體現優勢。
提供了一個很好的代碼複用平臺。
3. 代碼實例:
TestPaper是抽象類,其實就是抽象模板,定義並實現了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。TestPaperA,實現父類所定義的一個或多個抽象方法。每個TestPaper都可以有任意多的TestPaperA與之對應。
class TestPaper
{
public:
void question1()
{
cout<<"1+1="<<answer1()<<endl;
}
void question2()
{
cout<<"1*1="<<answer2()<<endl;
}
virtual string answer1()
{
return "";
}
virtual string answer2()
{
return "";
}
virtual ~TestPaper(){
}
};
class TestPaperA:public TestPaper
{
public:
string answer1()
{
return "2";
}
virtual string answer2()
{
return "1";
}
};
class TestPaperB:public TestPaper
{
public:
string answer1()
{
return "3";
}
virtual string answer2()
{
return "4";
}
};
int main()
{
cout<<"A的試卷:"<<endl;
TestPaper *s1=new TestPaperA();
s1->question1();
s1->question2();
delete s1;
cout<<endl;
cout<<"B的試卷:"<<endl;
TestPaper *s2=new TestPaperB();
s2->question1();
s2->question2();
return 0;
}