亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

模板模式-類行為型

Original 2016-11-09 16:08:51 660
abstrakt:原理模板方法模式是類的行為模式。準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。這就是模板方法模式的用意。在面向?qū)ο箝_發(fā)過(guò)程中,通常我們會(huì)遇到這樣的一個(gè)問(wèn)題:我們知道一個(gè)算法所需的關(guān)鍵步驟,并確定了這些步驟的執(zhí)行順序。但是某些步驟的具體實(shí)現(xiàn)是未知的,或者說(shuō)某些步驟

原理

模板方法模式是類的行為模式。準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。這就是模板方法模式的用意。

在面向?qū)ο箝_發(fā)過(guò)程中,通常我們會(huì)遇到這樣的一個(gè)問(wèn)題:我們知道一個(gè)算法所需的關(guān)鍵步驟,并確定了這些步驟的執(zhí)行順序。但是某些步驟的具體實(shí)現(xiàn)是未知的,或者說(shuō)某些步驟的實(shí)現(xiàn)與具體的環(huán)境相關(guān)。

1)模板方法模式是基于繼承的代碼復(fù)用基本技術(shù),模板方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心之一。在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實(shí)現(xiàn)放在不同的子類中。

2)在模板方法模式中,我們需要準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)讓子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn),這就是模板方法模式的用意。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較高的模式。

組成

 下載 (5).png

  這里涉及到兩個(gè)角色:

  抽象模板(Abstract Template)角色有如下責(zé)任:

  ■  定義了一個(gè)或多個(gè)抽象操作,以便讓子類實(shí)現(xiàn)。這些抽象操作叫做基本操作,它們是一個(gè)頂級(jí)邏輯的組成步驟。

  ■  定義并實(shí)現(xiàn)了一個(gè)模板方法。這個(gè)模板方法一般是一個(gè)具體方法,它給出了一個(gè)頂級(jí)邏輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到子類實(shí)現(xiàn)。頂級(jí)邏輯也有可能調(diào)用一些具體方法。

  具體模板(Concrete Template)角色又如下責(zé)任:

  ■  實(shí)現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法,它們是一個(gè)頂級(jí)邏輯的組成步驟。

  ■  每一個(gè)抽象模板角色都可以有任意多個(gè)具體模板角色與之對(duì)應(yīng),而每一個(gè)具體模板角色都可以給出這些抽象方法(也就是頂級(jí)邏輯的組成步驟)的不同實(shí)現(xiàn),從而使得頂級(jí)邏輯的實(shí)現(xiàn)各不相同。

優(yōu)缺點(diǎn)

板方法模式的優(yōu)點(diǎn):

1)模板方法模式在一個(gè)類中形式化地定義算法,而由它的子類實(shí)現(xiàn)細(xì)節(jié)的處理。

2)模板方法是一種代碼復(fù)用的基本技術(shù)。它們?cè)陬悗?kù)中尤為重要,它們提取了類庫(kù)中的公共行為。

3)模板方法模式導(dǎo)致一種反向的控制結(jié)構(gòu),這種結(jié)構(gòu)有時(shí)被稱為“好萊塢法則” ,即“別找我們,,我們找你”通過(guò)一個(gè)父類調(diào)用其子類的操作(而不是相反的子類調(diào)用父類),通過(guò)對(duì)子類的擴(kuò)展增加新的行為,符合“開閉原則” 

模板方法模式的缺點(diǎn):

每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象,但是更加符合“單一職責(zé)原則”,使得類的內(nèi)聚性得以提高。

與其他模式的區(qū)別

1)策略模式:模板方法使用繼承來(lái)改變算法的一部分。 Strategy使用委托來(lái)改變整個(gè)算法。模板方法模式與策略模式的作用十分類似,有時(shí)可以用策略模式替代模板方法模式。模板方法模式通過(guò)繼承來(lái)實(shí)現(xiàn)代碼復(fù)用,而策略模式使用委托,把不確定的行為集中到一個(gè)接口中,并在主類委托這個(gè)接口。委托比繼承具有更大的靈活性。

模板方法模式中的方法

  模板方法中的方法可以分為兩大類:模板方法和基本方法。

  模板方法

  一個(gè)模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。

  一個(gè)抽象類可以有任意多個(gè)模板方法,而不限于一個(gè)。每一個(gè)模板方法都可以調(diào)用任意多個(gè)具體方法。

  基本方法

  基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

  ●  抽象方法:一個(gè)抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在Java語(yǔ)言里抽象方法以abstract關(guān)鍵字標(biāo)示。

  ●  具體方法:一個(gè)具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。

  ●  鉤子方法:一個(gè)鉤子方法由抽象類聲明并實(shí)現(xiàn),而子類會(huì)加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個(gè)空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。

  在上面的例子中,AbstractTemplate是一個(gè)抽象類,它帶有三個(gè)方法。其中abstractMethod()是一個(gè)抽象方法,它由抽象類聲明為抽象方法,并由子類實(shí)現(xiàn);hookMethod()是一個(gè)鉤子方法,它由抽象類聲明并提供默認(rèn)實(shí)現(xiàn),并且由子類置換掉。concreteMethod()是一個(gè)具體方法,它由抽象類聲明并實(shí)現(xiàn)。

  默認(rèn)鉤子方法

  一個(gè)鉤子方法常常由抽象類給出一個(gè)空實(shí)現(xiàn)作為此方法的默認(rèn)實(shí)現(xiàn)。這種空的鉤子方法叫做“Do Nothing Hook”。顯然,這種默認(rèn)鉤子方法在缺省適配模式里面已經(jīng)見過(guò)了,一個(gè)缺省適配模式講的是一個(gè)類為一個(gè)接口提供一個(gè)默認(rèn)的空實(shí)現(xiàn),從而使得缺省適配類的子類不必像實(shí)現(xiàn)接口那樣必須給出所有方法的實(shí)現(xiàn),因?yàn)橥ǔR粋€(gè)具體類并不需要所有的方法。

  命名規(guī)則

  命名規(guī)則是設(shè)計(jì)師之間賴以溝通的管道之一,使用恰當(dāng)?shù)拿?guī)則可以幫助不同設(shè)計(jì)師之間的溝通。

  鉤子方法的名字應(yīng)當(dāng)以do開始,這是熟悉設(shè)計(jì)模式的Java開發(fā)人員的標(biāo)準(zhǔn)做法。在上面的例子中,鉤子方法hookMethod()應(yīng)當(dāng)以do開頭;在HttpServlet類中,也遵從這一命名規(guī)則,如doGet()、doPost()等方法。


Versionshinweise

Beliebte Eintr?ge