模板方法設計模式的意圖
設計一個框架,框架中整體步驟不可變,但是其中的有一些步驟是可變的,將可變的步驟放在不同的業務或者不同的模塊對應的子類中來實現
舉例
我們平時玩手機,我們可以將玩手機的過程分成以下幾步:
1.手機開機
2.選擇軟件
3.使用軟件
4.鎖屏
上述玩手機的步驟假設是不變的,這4步中,只有第2,3步是可變的,而第1,4步是不可變的,那麼就可以將整個步驟設計成一個框架,1,4步只需要在框架中提供一個藉口,對應的實現放在子類中完成
代碼如下
頭文件templatemethod.h
#ifndef HEADFILE
#define HEADFILE
#include <iostream>
#include <cassert>
using namespace std;
class playphone {
public:
playphone();
virtual ~playphone();
void openphone();//不變步驟
void lockscreen();//不變步驟
void run();//整體框架不變
protected:
virtual void chooseapp()=0;//可變
virtual void useapp()=0;//可變
};
class openapp:public playphone
{
public:
openapp(){cout<<__func__<<endl;}
~openapp(){cout<<__func__<<endl;}
virtual void chooseapp();//具體的可變步驟
virtual void useapp();//具體的可變步驟
};
#endif
源文件
templatemethod.cpp
#include "templatemethod.h"
playphone::playphone()
{
cout<<__func__<<endl;
}
playphone::~playphone()
{
cout<<__func__<<endl;
}
void playphone::openphone()
{
cout<<__func__<<endl;
}
void playphone::lockscreen()
{
cout<<__func__<<endl;
}
void playphone::run()
{
cout<<__func__<<endl;
openphone();
chooseapp();
useapp();
lockscreen();
}
void openapp::chooseapp()//可變步驟的具體實現
{
cout<<"choose weixin"<<endl;
}
void openapp::useapp()//可變步驟的具體實現
{
cout<<"use weixin"<<endl;
}
main.cpp
#include "templatemethod.h"
int main(int argc, char const *argv[])
{
playphone *instance=new openapp();
instance->run();//運行框架
delete instance;
instance=nullptr;
return 0;
}
CMakeLists
cmake_minimum_required(VERSION 2.8)
project( templatemethod )
INCLUDE_DIRECTORIES(include)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
add_executable(templatemethod ./src/templatemethod.cpp ./src/main.cpp )
運行結果
也就是說,可以看見,當用程序模擬玩手機的過程中,我們只需要在子類中修改chooseapp和useapp,就可以模擬出使用各種軟件的過程,程序中模擬玩微信的過程,如果想使用別的軟件,只要在chooseapp和useapp進行對應的修改即可,而不需要修改整個流程框架和其他的步驟,這也就是爲什麼我們在開發上層應用軟件的時候,根本看不到main函數和整體框架,只看到某些模塊文件,並且修改這些模塊文件就能解決相應的問題,因爲軟件的整體框架和流程已經寫好了,是不變的,只需要修改對應的某個步驟(可變的)即可,這就是模板方法設計模式。
參考:
https://www.bilibili.com/video/BV1kW411P7KS?p=3
《設計模式,可複用面向對象軟件的基礎》
歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出