模板方法模式

2021-07-10 22:44:10 字數 1804 閱讀 1541

uml類圖:

模板方法模式:定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。

使用場景:

類中可變與不可變得行為混合在一起,將類中重複的行為搬至基類,細節部分在子類中實現,去除類中的重複。

優缺點:

template模式是很簡單模式,但是也應用很廣的模式。如上面的分析和實現中闡明的template是採用繼承的方式實現演算法的異構,其關鍵點就是將通用演算法封裝在抽象基類中,並將不同的演算法細節放到子類中實現。

template模式獲得一種反向控制結構效果,這也是物件導向系統的分析和設計中乙個原則dip(依賴倒置:dependency inversion principles)。其含義就是父類呼叫子類的操作(高層模組呼叫低層模組的操作),低層模組實現高層模組宣告的介面。這樣控制權在父類(高層模組),低層模組反而要依賴高層模組。繼承的強制性約束關係也讓template模式有不足的地方,我們可以看到對於concreteclass類中的實現的原語方法primitive1(),是不能被別的類復用。假設我們要建立乙個abstractclass的變體anotherabstractclass,並且兩者只是通用演算法不一樣,其原語操作想復用abstractclass的子類的實現。但是這是不可能實現的,因為concreteclass繼承自abstractclass,也就繼承了abstractclass的通用演算法,anotherabstractclass是復用不了concreteclass的現,因為後者不是繼承自前者。template模式暴露的問題也正是繼承所固有的問題,strategy模式則通過組合

#pragma once

#ifndef _templatemethod_header_

#define _templatemethod_header_

//抽象類

#includeclass abstractclass

~abstractclass()

{} void templatemethod()

virtual void primitiveoperation1() = 0;

virtual void primitiveoperation2() = 0;

};class concreteclassa :public abstractclass

virtual void primitiveoperation1()

virtual void primitiveoperation2()

~concreteclassa()

{}};

class concreteclassb :public abstractclass

virtual void primitiveoperation1()

virtual void primitiveoperation2()

~concreteclassb()

{}};

#endif

#include#include"templatemethod.h"

using namespace std;

int main(void)

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...