溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解Java設(shè)計(jì)模式的模板方法模式

發(fā)布時(shí)間:2021-11-08 09:02:36 來源:億速云 閱讀:147 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“怎么理解Java設(shè)計(jì)模式的模板方法模式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解Java設(shè)計(jì)模式的模板方法模式”吧!

一、什么是模板方法模式

模板方法模式在一個(gè)方法中定義一個(gè)算法的骨架,而將一些步驟的實(shí)現(xiàn)延遲到子類中。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中某些步驟的具體實(shí)現(xiàn)。

看到“設(shè)計(jì)模式”這四個(gè)字我們往往會(huì)覺得高深莫測(cè),但是模板方法模式卻是一個(gè)例外,你要關(guān)注的就是一個(gè)方法而已。

模板方法模式確實(shí)非常簡(jiǎn)單,僅僅使用繼承機(jī)制,但是它是一個(gè)應(yīng)用非常廣泛的模式。

怎么理解Java設(shè)計(jì)模式的模板方法模式

二、模板方法模式的使用場(chǎng)景

當(dāng)系統(tǒng)中算法的骨架是固定的時(shí)候,而算法的實(shí)現(xiàn)可能有很多種的時(shí)候,就需要使用模板方法模式。

  • 多個(gè)子類有共有的方法,并且邏輯基本相同

  • 重要、復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)

  • 重構(gòu)時(shí),模板方法是一個(gè)經(jīng)常使用的方法,把相同的代碼抽取到父類中,然后通過構(gòu)造函數(shù)約束其行為。

舉例:需要做一個(gè)報(bào)表打印程序,用戶規(guī)定需要表頭,正文,表尾。但是客戶的需求會(huì)變化,一會(huì)希望這樣顯示表頭,一會(huì)希望那樣顯示。

這時(shí)候采用模板方式就合適。

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

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

封裝不變部分,擴(kuò)展可變部分。把認(rèn)為不變部分的算法封裝到父類中實(shí)現(xiàn),而可變部分的則可以通過繼承來繼續(xù)擴(kuò)展。提取公共部分代碼,便于維護(hù)。行為由父類控制,子類實(shí)現(xiàn)

缺點(diǎn):

算法骨架需要改變時(shí)需要修改抽象類。

按照設(shè)計(jì)習(xí)慣,抽象類負(fù)責(zé)聲明最抽象、最一般的事物屬性和方法,實(shí)現(xiàn)類負(fù)責(zé)完成具體的事務(wù)屬性和方法,但是模板方式正好相反,子類執(zhí)行的結(jié)果影響了父類的結(jié)果,會(huì)增加代碼閱讀的難度。

四、模板方法模式的實(shí)現(xiàn)

AbstractClass類---抽象模板類,定義并實(shí)現(xiàn)了一個(gè)模板方法。

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

abstract class AbstractClass
{
    //一些抽象行為放到子類去實(shí)現(xiàn)
    public abstract void PrivateOperation1();
    public abstract void PrivateOperation2();
     //模板方法,給出了邏輯的骨架,而邏輯的組成是一些相應(yīng)的抽象操作,它們都推遲到子類實(shí)現(xiàn)
    public void TemplateMethod()
    {
        PrivateOperation1();
        PrivateOperation2();
        Console.WriteLine("");
    }
}

ConcreteClass類,實(shí)現(xiàn)父類所定義的一個(gè)或者多個(gè)抽象方法。

每一個(gè)AbstractClass都可以有任意多個(gè)ConcreteClass與之對(duì)應(yīng),而每一個(gè)ConcreteClass都可以給出這些抽象方法的不同實(shí)現(xiàn),從而使得頂級(jí)邏輯的實(shí)現(xiàn)各不相同。

class ConcreteClassA : AbstractClass
{
    public override void PrivateOperation1()
    {
        Console.WriteLine("具體類A方法1實(shí)現(xiàn)");
    }
     public override void PrivateOperation2()
    {
        Console.WriteLine("具體類A方法2實(shí)現(xiàn)");
    }
}
class ConcreteClassB : AbstractClass
{
    public override void PrivateOperation1()
    {
        Console.WriteLine("具體類B方法1實(shí)現(xiàn)");
    }
     public override void PrivateOperation2()
    {
        Console.WriteLine("具體類B方法2實(shí)現(xiàn)");
    }
}

客戶端代碼

static void Main(string[] args)
{
    AbstractClass c;
    c = new ConcreteClassA();
    c.TemplateMethod();
     c = new ConcreteClassB();
    c.TemplateMethod();
     Console.Read();
}

感謝各位的閱讀,以上就是“怎么理解Java設(shè)計(jì)模式的模板方法模式”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么理解Java設(shè)計(jì)模式的模板方法模式這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI