模板方法(設計一個穩定的父類框架,框架中的有一些步驟是可變的,將可變的步驟子類中來實現)

模板方法設計模式的意圖

設計一個框架,框架中整體步驟不可變,但是其中的有一些步驟是可變的,將可變的步驟放在不同的業務或者不同的模塊對應的子類中來實現

 

舉例

我們平時玩手機,我們可以將玩手機的過程分成以下幾步:

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

《設計模式,可複用面向對象軟件的基礎》

 

歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章