亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

設計模式之生活中的模板模式

發布時間:2020-04-09 14:47:45 來源:網絡 閱讀:329 作者:凱哥Java 欄目:編程語言

設計模式之生活中的模板模式


在講模板模式原理前,我們按照管理,先來個生活中例子。茶館需要開發一個自動的泡咖啡和泡茶的程序。

本文出自:《凱哥學設計模式》系列教程中的模板模式一

我們先來看看泡咖啡和泡茶的步驟:

設計模式之生活中的模板模式

我們根據上圖寫代碼實現:

泡咖啡類,如下圖:

設計模式之生活中的模板模式

泡茶類如下圖:

設計模式之生活中的模板模式

測試類:

設計模式之生活中的模板模式

運行結果:

設計模式之生活中的模板模式

很簡單。也很容易寫出來。寫出來很清楚。

從上圖中,可以發現,兩個流程幾乎是一樣的套路(步驟)。其中,不變的部分:水燒開、倒入杯子、送給客人。這三步是不變的。

變化的是:沖咖啡還是泡茶葉;加糖/牛奶還是加檸檬這兩個步驟是變化的。

項目進化第一個版本:

我們將不變的抽取出來,放到一個公共的類中。HotDrink。然后讓coffe和tea都繼承公共的類。得到的類圖如下:

設計模式之生活中的模板模式

hotdrink超類代碼如下:

設計模式之生活中的模板模式

項目進化第二個版本:

經過分析,我們發現,兩個流程的還有相同的地方:

1.兩個流程的步驟都一樣(都是五個步驟的);

2.無論泡茶還是泡咖啡都是brew操作;

3.無論加糖還是加檸檬都是添加調料的。

所以,我們對項目在進行一次提取:

我們將操作流程也提取到超類中,將2和3操作也放到超類中。讓子類具體實現。所以得到類圖如下:

設計模式之生活中的模板模式

我們來看看這次hotdrink類里面:

public abstract class?HotDrink {

? ?public final void?prepareRecipe(){

? ? ? ?boilWater();

? ? ? ?brew();

? ? ? ?pourInCup();

? ? ? ?addCondiments();

? ? ? ?send();


? ?}


? ?protected abstract void?addCondiments();


? ?protected abstract void?brew();


? ?private final void?boilWater() {

? ? ? ?System.out.println("一.燒水");

? ?}

? ?private final void?pourInCup() {

? ? ? ?System.out.println("三.倒入杯中");

? ?}

設計模式之生活中的模板模式

我們發現,在prepareRecipe方法和boilWter、pourInCup、send這四個操作都添加了final關鍵字來修改。這是為什么呢?

從上面分析,我們知道,都是五個步驟,而且五個步驟中的三個步驟(燒水、倒入杯中、送客人)也是固定不變的。那么,在Java中,固定不變的這個怎么表示呢?對了,就使用fianl這個關鍵字修飾就可以了。這樣,就可以放置子類不能隨便修改步驟(比如由五步變成三步),已經規定的不能在修改了。比如燒水這個不燒了,這樣是不行的。

我們來看看,熱飲coffee和tea的類:

設計模式之生活中的模板模式

hotDrinkTea:

設計模式之生活中的模板模式

測試方法:

設計模式之生活中的模板模式

運行結果:

設計模式之生活中的模板模式

我們對項目進化進行復盤總結,可以得到:

所謂的模板模式:封裝了一個算法的步驟,并允許子類為一個或多個步驟方法提供實現。模板模式,可以使子類在不改變算法結構(如上面的五步)的情況下,重新定義算法中某些步驟(如上面的第二步和第四步)

模板模式類圖如下:

設計模式之生活中的模板模式

類圖說明:

1:是一個抽象類(如:hotDrink)

2:有個模板方法。這個模板方法是final的(如:prepareRecipe方法)

3:由三種方法:

AbsOperation:抽象的方法(泡咖啡、加牛奶)

concreteOp:具體的方法(如燒水。可以是final的也可以不是)

hook:鉤子。可以選的子類可以覆蓋父類的方法。

我們來演示下帶有hook的。

比如,現在有了新需求,客戶可以自己選擇需不需要添加調料。這個怎么做呢?

本文來源:

凱哥Java(kaigejava)

凱哥個人博客:www.kaigejava.com


我們從新定義模板:

設計模式之生活中的模板模式

tea實現了該模板類,并且不加檸檬的:

設計模式之生活中的模板模式

測試運行:

設計模式之生活中的模板模式

結果:

設計模式之生活中的模板模式




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

门头沟区| 滨海县| 阜康市| 芜湖县| 和林格尔县| 克拉玛依市| 长治县| 昌平区| 阿拉尔市| 朝阳区| 磴口县| 贵南县| 乌鲁木齐市| 古蔺县| 中卫市| 湟中县| 大新县| 乌拉特后旗| 岳普湖县| 永丰县| 盐津县| 车致| 黑山县| 郴州市| 织金县| 永寿县| 武义县| 上蔡县| 财经| 潍坊市| 民县| 五指山市| 卢湾区| 荔波县| 双柏县| 行唐县| 玛多县| 犍为县| 三门峡市| 育儿| 翼城县|