C Template(模板方法)模式 行為型模式

2021-10-14 23:16:08 字數 2640 閱讀 6680

模板方法屬於行為型設計模式,行為型設計模式主要關注物件之間職責分配和演算法的問題。類行為型模式使用繼承來分配類之間的職責,模板方法就是個類行為型模式。物件行為型模式使用組合來分配職責。在我們構建軟體的過程中大部分時候我們都是在思考實體之間的職責,怎樣的職責分配最合理,不至於過重,又不至於過輕,而且又不越權。在物件導向系統的分析與設計過程中經常會遇到這樣一種情況:對於某乙個業務邏輯 (演算法實現)在不同的物件中有不同的細節實現,但是邏輯(演算法)的框架(或通用的應用 演算法)是相同的。template 提供了這種情況的乙個實現框架。 template 模式是採用繼承的方式實現這一點:將邏輯(演算法)框架放在抽象基類中,並 定義好細節的介面,子類中實現細節。【注釋 1】

【注釋 1】:strategy 模式解決的是和 template 模式類似的問題,但是 strategy 模式是將邏輯 演算法)封裝到乙個類中,並採取組合(委託)的方式解決這個問題。

模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟的實現延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中某些步驟的具體實現。

看到「設計模式」這四個字我們往往會覺得高深莫測,但是模板方法模式卻是乙個例外,你要關注的就是乙個方法而已

模板方法模式確實非常簡單,僅僅使用繼承機制,但是它是乙個應用非常廣泛的模式。

當系統中演算法的骨架是固定的時候,而演算法的實現可能有很多種的時候,就需要使用模板方法模式。

舉例:需要做乙個報表列印程式,使用者規定需要表頭,正文,表尾。但是客戶的需求會變化,一會希望這樣顯示表頭,一會希望那樣顯示。 

這時候採用模板方式就合適。

優點:

缺點:

演算法骨架需要改變時需要修改抽象類。

按設照計習慣,抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類負責完成具體的事務屬性和方法,但是模板方式正好相反,子類執行的結果影響了父類的結果,會增加**閱讀的難度。

abstractclass類---抽象模板類,定義並實現了乙個模板方法。

這個模板一般是乙個具體方法,它給出了乙個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。

頂級邏輯也有可以呼叫具體的方法

#pragma once

class abstractclass

; class concreteclass1:public abstractclass

; class concreteclass2:public abstractclass ;

#include "stdafx.h"

#include "template.h"

#include using namespace std;

abstractclass::abstractclass()

abstractclass::~abstractclass()

void abstractclass::templatemethod()

concreteclass1::concreteclass1()

concreteclass1::~concreteclass1()

void concreteclass1::primitiveoperation1()

由於 template 模式的實現**很簡單,因此解釋是多餘的。其關鍵是將通用演算法(邏 輯)封裝起來,而將演算法細節讓子類實現(多型)。

唯一注意的是我們將原語操作(細節演算法)定義未保護(protected)成員,只供模板方 法呼叫(子類可以)。

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

template 模式獲得一種反向控制結構效果,這也是物件導向系統的分析和設計中乙個原 則 dip(依賴倒置:dependency inversion principles)。其含義就是父類呼叫子類的操作(高 層模組呼叫低層模組的操作),低層模組實現高層模組宣告的介面。這樣控制權在父類(高 層模組),低層模組反而要依賴高層模組。

繼承的強制性約束關係也讓 template 模式有不足的地方,我們可以看到對於 concreteclass 類中的實現的原語方法 primitive1(),是不能被別的類復用。假設我們要建立 乙個 abstractclass 的變體 anotherabstractclass,並且兩者只是通用演算法不一樣,其原語操 作想復用 abstractclass 的子類的實現。但是這是不可能實現的,因為 concreteclass 繼承自 abstractclass,也就繼承了 abstractclass 的通用演算法,anotherabstractclass 是復用不了 concreteclass 的實現,因為後者不是繼承自前者。

template 模式暴露的問題也正是繼承所固有的問題,strategy 模式則通過組合(委託) 來達到和 template 模式類似的效果,其代價就是空間和時間上的代價,關於 strategy 模式的 詳細討論請參考 strategy 模式解析。

C template(模板)的使用

在c 中,針對於 泛型 的程式設計時,需要使用模板,泛型 任何資料型別。比如 做乙個同時支援int和double型的加法運算,並輸出。傳統的做法 include using namespace std int add int a,int b double add double a,double b ...

c template筆記 1 模板函式

template inline t const max t const a,t const b include include include max.hpp int main 輸出結果 max 1,2 ok max 1,1.2 wrong max static cast 4 4.1 ok 若兩個引...

c template筆記 1 模板函式

template inline t const max t const a,t const b include include include max.hpp int main 輸出結果 max 1,2 ok max 1,1.2 wrong max static cast 4 4.1 ok若兩個引數...