模板方法模式

2022-08-26 15:57:22 字數 3910 閱讀 7749

一、完成者資訊

姓名:陳緋

學號:07770230

二、模式資訊

模式名稱:模板方法模式

1.問題描述

生活場景:大家都經常會用到對資料庫中表進行操作,有時候資料庫中有若干個表,我們往往是乙個乙個的對相應的表進行連線資料庫,然後對指定的表進行增、刪、改、查的一系列操作,組後關閉資料庫的連線。但是當我們要對大型的資料庫進行這些操作的時候,你會發現這些操作很繁瑣,要對每乙個表都進行相同的處理,加大的資料的操作工作。

設計目的:實現對若干個不相同的表進行重複的增刪改查工作。

2.不假思索的思路

思路描述:對templatemethod資料庫中的categories表進行資料庫的連線,表的增刪改查以及資料庫的關閉等操作。

類結構圖如下:

存在問題:

試想:當表相對較少的時候操作還比較簡單,但是當表相對較多的時候,就會非常的麻煩,需要對每乙個表重複上面的幾個操作。所以「變化」是軟體設計的永恆主題,有變化就會帶來無窮盡的複雜,那我們就找出一種模式去應變這種變化的複雜性,設計模式的藝術性和複雜度就在於如何分析,並發現系統中的變化和穩定點,並使用特定的設計方法來應對這種變化。

**如下:

3.歸納階段:

思路描述:結合上面的變化(template method)就是定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。template method讓子類重新定義乙個演算法的某些步驟而無需改變演算法的結構。

模板方法就是關於怎麼樣將若干個方法整合到乙個方法中,以便形成乙個解決問題的演算法骨架,它的關鍵在於,在乙個抽象類中定義乙個演算法骨架,即將若干個方法整合到乙個方法中,並稱該方法為乙個模板方法,或直接就叫模板。模板方法所呼叫的其他方法通常稱為抽象的方法,這些抽象的方法相當於演算法骨架中的各個步驟,這些步驟的實現可以由子類去完成。(實際處理交給子類區處理)

template method的uml類圖如下:

connect();     //連線資料庫

select();      //執行查詢命令

insert();      //執行插入命令

delete();      //執行刪除命令

updata();      //執行更新命令

display();     //顯示資料

disconnect();  //斷開資料庫連線

雖然這些步驟是固定的,但是對於每一張具體的資料表所執行的查詢卻是不一樣的。這樣就需要乙個抽象角色,給出頂級行為的實現。

用模板方法模式修改後的類圖如下:

**的實現

執行結果:

4.驗證階段:

思路描述:針對上面的操作新增加乙個對products表的操作。

類結構圖:

增加的**如下:

**

namespace

templatemethod

protected

override

void

select()

protected

override

void

display()

console.writeline();

}protected

override

void

insert()

protected

override

void

delete()

protected

override

void

updata()

protected

override

void

disconnect()}}

namespace

templatemethod}}

執行結果:

這樣應用模板方法以後不管再對多少張表進行操作,骨架是不變的,而實際的一些步驟延遲到子類中去實現。

5.模板方法模式總結:

1.  模板方法模式在乙個類中形式化的定義演算法,而由它的子類實現細節的處理,其優勢是,在子類定義處理演算法時不會改變演算法的結構,其特點是,每個不同的實現都需要定義乙個子類,這也是符合高內聚的責任分配模式,不能簡單的說是它的缺點。

2.  可以通過在抽象模板定義模板方法給出成熟的演算法步驟,同時又不限制步驟的細節,具體模板實現演算法細節不會改變整個演算法的骨架。

3.適合模板方法模式的情景

(1)設計者需要給出乙個演算法的固定步驟,並將某些步驟的具體實現留給子類來實現。

(2)需要對**進行重構,將各個子類公共行為提取出來集中到乙個共同的父類中以避免**重負。  

**

namespace

templatemethod}}

//在這個頂級的框架datasqlobject中給出了模板固定的輪廓,public void run()便是模版方法。而connect()、select()、insert()、delete()、updata()、display()、connect()這幾個抽象方法就留給具體的子類去實現:

namespace

templatemethod

protected

override

void

select()

protected

override

void

display()

console.writeline();

}protected

override

void

insert()

protected

override

void

delete()

protected

override

void

updata()

protected

override

void

disconnect()}}

//最後就是客戶端程式的呼叫,不需要再去呼叫每乙個步驟的方法:

namespace

templatemethod}}

模板方法模式

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

模板方法模式

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

模板方法模式

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