模板方法模式

2021-07-15 11:31:49 字數 3277 閱讀 9651

1. 概述

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

2. 模式中的角色

2.1 抽象類(abstractclass):實現了模板方法,定義了演算法的骨架。

2.2 具體類(concreteclass):實現抽象類中的抽象方法,已完成完整的演算法。

3. 模式解讀

3.1 模板方法類圖

3.2 模板方法模式**實現

///

///抽象類

/// public

abstract

class

abstractclass

}//////

具體類,實現了抽象類中的特定步驟

/// public

class

concreteclassa : abstractclass

//////

與concreteclassb中的實現邏輯不同

/// public

override

void

primitiveoperation2()

}//////

具體類,實現了抽象類中的特定步驟

/// public

class

concreteclassb : abstractclass

//////

與concreteclassa中的實現邏輯不同

/// public

override

void

primitiveoperation2()

}

3.3 客戶端**

class

program

}

執行結果

5. 模式總結

5.1 優點

5.1.1 模板方法模式通過把不變的行為搬移到超類,去除了子類中的重複**。

5.1.2 子類實現演算法的某些細節,有助於演算法的擴充套件。

5.1.3 通過乙個父類呼叫子類實現的操作,通過子類擴充套件增加新的行為,符合「開放-封閉原則」。

5.2 缺點

5.2.1 每個不同的實現都需要定義乙個子類,這會導致類的個數的增加,設計更加抽象。

5.3 適用場景

5.1 在某些類的演算法中,用了相同的方法,造成**的重複。

5.2 控制子類擴充套件,子類必須遵守演算法規則。

6. 模式舉例: 用冒泡演算法非別對整型陣列、浮點數陣列、日期陣列實現排序。

6.1 實現類圖

6.2 實現**

///

///抽象類,定義氣泡排序的骨架

/// public

abstract

class

bubblesorter

for (int nexttolast = length - 2; nexttolast >= 0; nexttolast--)

operations++;}}

return

operations;

}//////

留給子類實現的交換位置方法

/// ///

protected

abstract

void swap(int

index);

//////

留給子類實現的比較方法

/// ///

///protected

abstract

bool outoforder(int

index);

}//////

整型型別的冒泡演算法實現

/// public

class

intbubblesorter:bubblesorter

//////

實現冒泡演算法中的交換操作

/// ///

protected

override

void swap(int

index)

//////

實現冒泡演算法中的比較操作

/// ///

///protected

override

bool outoforder(int

index)

}//////

浮點數型別的冒泡演算法

/// public

class

floatbubblesorter:bubblesorter

//////

實現冒泡演算法中的交換操作

/// ///

protected

override

void swap(int

index)

//////

實現冒泡演算法中的比較操作

/// ///

///protected

override

bool outoforder(int

index)

}

6.3 客戶端呼叫

class

program

;bubblesorter.intbubblesorter sorter = new

bubblesorter.intbubblesorter();

sorter.sort(intarray);

foreach (int item in

intarray)

console.writeline(

"");

//對浮點數排序

float floatarray = new

float ;

bubblesorter.floatbubblesorter floatsorter = new

bubblesorter.floatbubblesorter();

floatsorter.sort(floatarray);

foreach (float item in

floatarray)

console.read();}}

執行結果

模板方法模式

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

模板方法模式

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

模板方法模式

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