C++實(shí)現(xiàn)模板方法模式的示例代碼
模式定義
模板方法模式(Facade),定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模式動(dòng)機(jī)
- 當(dāng)我們要完成在某一細(xì)節(jié)層次一致的一個(gè)過(guò)程或一系列步驟,但其個(gè)別步驟在更詳細(xì)的層次上的實(shí)現(xiàn)可能不同時(shí),我們通??紤]用模板方法模式來(lái)處理。
- 既然用了繼承,并且肯定這個(gè)繼承有意義,就應(yīng)該要成為子類的模板,所有重復(fù)嗲嗎都應(yīng)該要上升到父類去,而不是讓每個(gè)子類都去重復(fù)。
UML類圖

源碼實(shí)現(xiàn) abstractclass.h
class AbstractClass
{
public:
AbstractClass();
virtual ~AbstractClass();
void MethodA();
virtual int MethodB(int a = 0, int b = 0);
};
abstractclass.cpp
#include "abstractclass.h"
#include <iostream>
AbstractClass::AbstractClass()
{
}
AbstractClass::~AbstractClass()
{
}
void AbstractClass::MethodA()
{
std::cout << __FUNCTION__ << " Call method b :" << this->MethodB(5, 4) << std::endl;
}
int AbstractClass::MethodB(int a, int b)
{
return a + b;
}
concreteclassa.h
#include "abstractclass.h"
class ConcreteClassA : public AbstractClass
{
public:
ConcreteClassA();
int MethodB(int a = 0, int b = 0) override;
};
concreteclassa.cpp
#include "concreteclassa.h"
ConcreteClassA::ConcreteClassA()
{
}
int ConcreteClassA::MethodB(int a, int b)
{
return a * b;
}
concreteclassb.h
#include "concreteclassb.h"
ConcreteClassB::ConcreteClassB()
{
}
int ConcreteClassB::MethodB(int a, int b)
{
return a - b;
}
concreteclassb.cpp
#include "concreteclassb.h"
ConcreteClassB::ConcreteClassB()
{
}
int ConcreteClassB::MethodB(int a, int b)
{
return a - b;
}
main.cpp
#include <iostream>
#include "concreteclassa.h"
#include "concreteclassb.h"
using namespace std;
int main()
{
ConcreteClassA* classA = new ConcreteClassA();
classA->MethodA();
ConcreteClassB* classB = new ConcreteClassB();
classB->MethodA();
return 0;
}
運(yùn)行結(jié)果
MethodA Call method b :20
MethodA Call method b :1
優(yōu)點(diǎn)
模板方法模式的優(yōu)點(diǎn)
- 通過(guò)把不變的行為搬移到超類,去除子類中的重復(fù)代碼來(lái)體現(xiàn)它的優(yōu)勢(shì)。
- 提供了一個(gè)很好的代碼復(fù)用的平臺(tái)。
- 當(dāng)不變的和可變的行為在方法的子類實(shí)現(xiàn)中混合在一起的時(shí)候,不變的行為就會(huì)在子類中重復(fù)出現(xiàn)。我們通過(guò)模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類拜托重復(fù)的不變行為的糾纏。
缺點(diǎn)
模式的缺點(diǎn)
到此這篇關(guān)于++實(shí)現(xiàn)模板方法模式的示例代碼的文章就介紹到這了,更多相關(guān)c++ 模板方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++數(shù)組中重復(fù)的數(shù)字
這篇文章主要介紹得是關(guān)于C++數(shù)組中重復(fù)的數(shù)字,文章以問(wèn)題描述得形式,對(duì)問(wèn)題展開分析用不同得方法去解決問(wèn)題并附上方法得詳細(xì)代碼,需要的朋友可以參考以下文章得具體內(nèi)容2021-11-11
QT中刪除信號(hào)于槽的連接的實(shí)現(xiàn)
本文主要介紹了QT中刪除信號(hào)于槽的連接的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
OpenCV邊緣提取算法流程的實(shí)現(xiàn)(附DEMO)
本文主要介紹了OpenCV邊緣提取算法流程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Qt基礎(chǔ)開發(fā)之QString與QByteArray詳細(xì)用法與區(qū)別及QString QByteArray互轉(zhuǎn)
這篇文章主要介紹了Qt基礎(chǔ)開發(fā)之QString與QByteArray詳細(xì)用法與區(qū)別及QString QByteArray互轉(zhuǎn),需要的朋友可以參考下2020-03-03
C語(yǔ)言菜鳥基礎(chǔ)教程之?dāng)?shù)據(jù)類型
在 C 語(yǔ)言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式。2017-10-10

