日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

分析設計模式之模板方法Java實現

瀏覽:118日期:2022-08-10 08:52:49
目錄一、什么是模板方法設計模式1.1、模板方法的用途1.2、模板方法的定義二、定義模板方法的步驟2.1、定義模板類2.2、定義具體子類2.3、定義客戶端調用2.4 下抽象類和子類之間的UML圖和源碼實現三、案例3.1、案例1: 一日規劃3.2、案例2: 鉤子方法四、模板方法的優缺點4.1、優點4.2、缺點五、使用場景六、對設計模式六大原則的應用思考一、什么是模板方法設計模式

從字面意義上理解, 模板方法就是定義出來一套方法, 作為模板, 也就是基礎。 在這個基礎上, 我們可以進行加工,實現個性化的實現。比如:一日餐三. 早餐, 中餐, 晚餐. 每個人都要吃三餐, 但每個人的三餐吃的可能都不一樣. 一日三餐定義了模板--早中晚, 每個人的三餐就是模板的具體實現.

1.1、模板方法的用途 將不變的行為從子類搬到超類,去除了子類中的重復代碼 規范子類的結構1.2、模板方法的定義

定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。它是一種類行為型模式。

二、定義模板方法的步驟2.1、定義模板類

通常模板類是抽象類,負責給出算法的輪廓或者框架。他是有若干個模板方法和若干個基本方法構成。

1.模板方法

定義了算法的骨架, 定義了方法調用的順序, 其中包含一個或者多個基本方法

2.基本方法

基本算法有三種類型:

​a) 抽象方法:子類必須重寫的方法。沒有默認實現。

​b)具體方法:父類定義的默認實現,有實現邏輯,可以被具體的子類繼承或重寫

​c)鉤子方法:判斷的邏輯方法和需要子類重寫的空方法兩種。

2.2、定義具體子類

具體子類,也就是具體的實現類, 實現抽象類中的抽象方法。他們是抽象的模板方法中一個組成部分。

2.3、定義客戶端調用

客戶端調用抽象類, 實例化的時候實例化具體類, 只需要調用抽象類的模板方法就可以了。

2.4 下抽象類和子類之間的UML圖和源碼實現

1.UML圖

分析設計模式之模板方法Java實現

從圖中可以看出抽象類的結構可以定義三類方法。 可以有一個也可以有多個。子類必須需要實現抽象類中的抽象方法,可以選擇性重寫父類的具體方法。子類實現接口的時候,要多思考設計模式的六大原則。

2.源碼

先定義抽象類, 也就是框架。

package com.lxl.www.designPatterns.templatePattern.template;/** * 抽象類, 定義模板 */public abstract class AbstractClass { /** * 定義模板方法 * 規范了流程的框架 */ public void templateMethod() {// 先調用具體方法specificMethod();// 在調用抽象方法abstractMethod(); } /** * 具體方法 */ public void specificMethod() {// 具體的公共邏輯, 父子類通用System.out.println('具體方法---父子類通用邏輯'); } /** * 抽象方法 * * 抽象方法, 子類必須重寫 */ public abstract void abstractMethod();}

在定義具體的實現類, 實現父類的抽象方法

package com.lxl.www.designPatterns.templatePattern.template;/** * 具體實現類 */public class ConcreteClass extends AbstractClass{ /** * 重寫父類的抽象方法 */ @Override public void abstractMethod() {System.out.println('具體實現類--重寫父類的抽象方法'); }}

最后定義客戶端調用

package com.lxl.www.designPatterns.templatePattern.template;/** * 模板方法客戶端 */public class TemplateClient { public static void main(String[] args) {AbstractClass abstractClass = new ConcreteClass();abstractClass.templateMethod(); }}

運行結果:

具體方法---父子類通用邏輯

具體實現類--重寫父類的抽象方法

對照模板方法設計模式,我們來看一個具體的案例。

三、案例3.1、案例1: 一日規劃

每個人的一日安排都有三餐, 早餐, 中餐,晚參。 但每個人的三餐食物不盡相同,我們來看看每個人的三餐變化, 以及三餐前后要做的事情。

package com.lxl.www.designPatterns.templatePattern.oneDayArrangement;/** * 一日三餐抽象類 */public abstract class ArrangementAbstract { /** * 模板方法 * 規定了一天的框架 */ public void templateMethod() {System.out.println('一日安排如下: ');getUp();breakfast();lunch();dinner();getDown(); } public void getUp() {System.out.println('起床'); } public void getDown() {System.out.println('睡覺'); } /** * 早餐抽象類 */ public abstract void breakfast() ; /** * 午餐抽象類 */ public abstract void lunch(); /** * 晚餐抽象類 */ public abstract void dinner();}

定義一日三餐抽象類。每個人的日程安排都是,起床,早餐,中餐,晚餐,睡覺。 其中起床和睡覺是每個人都要做的事情,三餐也是,但三餐的食物不同,于是我們將三餐定義為抽象

一日安排實現類

package com.lxl.www.designPatterns.templatePattern.oneDayArrangement;/** * 張三的一日三餐安排 */public class PersonArrangement extends ArrangementAbstract{ private String name; public PersonArrangement(String name) {this.name = name; } /** * 早餐抽象類 */ public void breakfast(){System.out.println(name + '--早餐吃牛奶面包'); } /** * 午餐抽象類 */ public void lunch() {System.out.println(name + '--中餐吃食堂'); } /** * 晚餐抽象類 */ public void dinner() {System.out.println(name + '--晚餐吃水果'); }}

客戶端調用

public class Client { public static void main(String[] args) {ArrangementAbstract zhangsan = new PersonArrangement('張三');zhangsan.templateMethod(); }}

運行結果:

一日安排如下:起床張三--早餐吃牛奶面包張三--中餐吃食堂張三--晚餐吃水果睡覺

可以看出, 完全按照模板方法的步驟實現。

3.2、案例2: 鉤子方法

我們上面說了, 模板方法設計模式中, 基本方法包括抽象方法,具體方法和鉤子方法.如果能夠使用好鉤子方法, 可以在程序中完美實現子類控制父類的行為. 我們來看下面的案例:

我們在抽象方法中定義一個鉤子方法hookMethod(), 在模板方法templateMethod()中,鉤子方法控制了代碼的流程.

UML圖:

分析設計模式之模板方法Java實現

源代碼:

package com.lxl.www.designPatterns.templatePattern.hookMethod;/** * 抽象類, 定義模板 */public abstract class AbstractClass { /** * 定義模板方法 * 規范了流程的框架 */ public void templateMethod() {// 調用具體方法specificMethod();// 鉤子方法控制下一步驟if (hookMethod()) { // 調用抽象方法 abstractMethod();} } /** * 具體方法 */ public void specificMethod() {// 具體的公共邏輯, 父子類通用System.out.println('具體方法---父子類通用邏輯'); } /** * 鉤子方法 * 鉤子方法是有具體實現的, */ public boolean hookMethod() {return true; } /** * 抽象方法 * * 抽象方法, 子類必須重寫 */ public abstract void abstractMethod();}

定義具體實現

/** * 具體實現類 */public class ConcreteClass extends AbstractClass { /** * 重寫父類的抽象方法 */ @Override public void abstractMethod() {System.out.println('具體實現類--重寫父類的抽象方法'); } /** * 鉤子方法 * @return */ @Override public boolean hookMethod() {System.out.println('重寫了父類的鉤子方法, 反向控制父類的行為');return false; }}

重寫了鉤子方法, 反向控制父類的行為

public class TemplateClient { public static void main(String[] args) {AbstractClass abstractClass = new ConcreteClass();abstractClass.templateMethod(); }}

運行結果

具體方法---父子類通用邏輯重寫了父類的鉤子方法, 反向控制父類的行為

如果子類鉤子方法 HookMethod() 的代碼改變,則程序的運行結果也會發生改變。

四、模板方法的優缺點4.1、優點

1.規范了框架, 封裝了不變的部分, 擴展了可變的部分. 父類定義框架, 并抽象了公共不變的部分, 子類通過重寫擴展完善了框架的實現。

2.使用了'開閉原則', 對擴展開放, 對修改關閉. 子類可以通過重寫父類的抽象方法來擴展父類的實現。

3.行為集中有父類控制, 規范流程。

4.2、缺點

1.每一種實現都需要定義一個具體實現類, 增加類的數量, 系統更加復雜。

2.繼承的缺點, 一旦父類增加一個抽象方法, 所有子類都需要增加. 這一點違背'開閉原則'。

3.父類中的抽象方法由子類實現, 子類的執行結果影響父類, 這種'反向控制'結構, 會增加代碼的復雜性。

五、使用場景

1.算法的整體步驟是固定的,但個別部分容易發生變化時,可以考慮使用模板方法設計模式,將容易發生變化的部分抽象出來,提供給子類去實現。

2.當多個子類存在公共的行為時,可以將其提取出來并集中到一個公共父類中以避免代碼重復。首先,要識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。

3.當需要控制子類的擴展時,模板方法只在特定點調用鉤子操作,這樣就只允許在這些點進行擴展。

4.重構時,模板方法模式是一個經常使用到的模式,把相同的代碼抽取到父類中,通過鉤子函數約束其行為

六、對設計模式六大原則的應用思考

1.單一職責原則: 一個方法只有一個引起變化的原因, 這個不太好看出, 要開子類代碼的具體實現

2.里式替換原則: 父類出現的地方都可以使用子類替換,并且結果保持一致. 子類重寫了父類的方法。 模板方法設計模式可能違背里式替換原則, 不過,這正是能夠“反向控制”的原理

3.接口隔離原則: 依賴于最小的單一接口, 而不是胖接口. 符合

4.依賴倒置原則: 依賴于抽象, 而不是依賴于具體. 符合

5.迪米特法則: 最少知識原則. 之和朋友溝通, 減少和朋友的溝通. 這個需要看子類具體實現是否符合

6.開閉原則: 違背開閉原則, 一旦父類增加一個抽象方法, 所有子類都需要對應增加

以上就是分析設計模式之模板方法的詳細內容,更多關于設計模式 模板方法的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩在线网址| 国产精品毛片一区二区三区| 亚洲精品国产日韩| 国产精品久久久久久av公交车| 岛国av免费在线观看| 国产精品3区| 国产精品男女| 美腿丝袜亚洲三区| 激情不卡一区二区三区视频在线| 国产激情一区| 欧美丰满日韩| 欧美日韩在线二区| 999国产精品| 一本色道精品久久一区二区三区| 午夜在线视频一区二区区别| 免费黄网站欧美| 日韩精品久久久久久久软件91| 日韩欧美高清一区二区三区| 欧美日韩黄网站| 欧美国产日本| 日韩三区免费| 香蕉视频成人在线观看| 亚洲毛片一区| 欧美xxxx性| 高清av不卡| 99视频在线精品国自产拍免费观看| 蜜臀av一区二区在线免费观看| 亚洲日韩中文字幕一区| 国产毛片精品| 日韩一区二区中文| 视频在线观看91| 久久国产三级| 久久男人天堂| 视频一区国产视频| 国产精品白浆| 日本精品不卡| 丝袜美腿亚洲一区| 久久成人高清| 国精品一区二区三区| 亚洲精品第一| 麻豆国产欧美一区二区三区| 激情综合在线| 婷婷综合国产| 日韩大片免费观看| 夜久久久久久| 国产极品一区| 国产99久久| 91欧美极品| 日韩另类视频| 日韩av影院| 日韩精品免费一区二区在线观看| 亚洲综合中文| 亚洲性色av| 亚洲神马久久| 欧美精品导航| 免费成人av在线播放| 日韩成人免费| 亚洲一区二区三区无吗| 精品国产aⅴ| 亚洲少妇诱惑| 欧美国产美女| 日韩福利在线观看| 欧美日韩在线网站| 另类综合日韩欧美亚洲| 亚洲激情偷拍| 精品美女在线视频| 日韩中文欧美在线| 成人片免费看| 国产欧美一区二区三区国产幕精品 | 天堂а√在线最新版中文在线| 99在线精品视频在线观看| 精品美女久久| 久久都是精品| 精品99在线| 国产精品男女| 中文一区在线| 欧美二三四区| 国产精品久久久网站| 欧美成人精品三级网站| 91嫩草精品| 狠狠爱成人网| 色网在线免费观看| 麻豆传媒一区二区三区| 亚洲精品国模| 欧美精品一线| 色88888久久久久久影院| 久久99精品久久久野外观看| 亚洲免费专区| 91久久午夜| 久久精选视频| 国产精品久久久久久久久久10秀| 日韩高清不卡在线| 中文字幕一区二区精品区| 天堂√中文最新版在线| 久久精品亚洲| 欧美日本三区| 亚洲精品乱码久久久久久蜜桃麻豆| 精品中文一区| 色吊丝一区二区| 在线天堂资源www在线污| 老司机精品视频网| 国产精品久一| 国产精品白丝一区二区三区| 日韩成人午夜精品| 亚洲精品无吗| 日韩中文字幕亚洲一区二区va在线 | 精品精品99| 国产丝袜一区| 日韩美女国产精品| 亚洲精品乱码| 亚洲最大av| 亚洲精品一二三**| 亚洲视频国产精品| 日韩一区欧美二区| 免费成人在线影院| 最新国产精品| 亚洲狼人精品一区二区三区| 性欧美精品高清| 视频一区欧美精品| 蜜桃视频一区二区三区在线观看| 国产伊人精品| 狠狠干综合网| 美女黄网久久| 免费在线欧美视频| 色综合视频一区二区三区日韩| 亚欧洲精品视频在线观看| 天海翼亚洲一区二区三区| 日韩精品社区| 免费一级欧美在线观看视频| 久久精品国产久精国产| 国内精品伊人| 成人日韩在线| 亚洲男女av一区二区| 亚洲永久字幕| 久久精品官网| 日韩中文在线播放| 国产亚洲毛片| 亚洲不卡视频| 久久99免费视频| 成人精品国产亚洲| 亚洲午夜91| 免费成人性网站| 国产日韩欧美三级| 久久伊人久久| 亚洲91精品| 免费看欧美美女黄的网站| 国产日韩三级| 欧产日产国产精品视频| 婷婷亚洲五月| 香蕉久久久久久| 国产日韩欧美| 欧洲亚洲一区二区三区| 亚洲欧美日韩国产综合精品二区 | 日韩在线精品| 国产精品主播| 黄页网站一区| 久久精品亚洲欧美日韩精品中文字幕| 国产日韩精品视频一区二区三区| 久久福利毛片| 国产精品综合| 在线精品亚洲欧美日韩国产| 欧美jjzz| 日韩国产91| 国产一区成人| 国产精品3区| 久久爱www成人| 国产精品午夜一区二区三区| 久久亚洲欧洲| 久久精品凹凸全集| 男人操女人的视频在线观看欧美| 日韩av网站在线观看| 美女91精品| 亚洲精品国产日韩| 日韩视频免费| 日韩av一区二区三区四区| 国产精品男女| 日韩中文在线播放| 亚洲精品一区二区妖精| 日韩高清一区二区| 色黄视频在线观看| 日韩中出av| 国产va在线视频| 蜜臀a∨国产成人精品| 激情综合婷婷| 制服诱惑一区二区| 国产精品久久久久久久久久齐齐| 久久国产免费| 日韩欧美激情电影| 香蕉视频亚洲一级| 日韩精品第一| 久久久成人网| 69精品国产久热在线观看| 亚洲女同av| 亚洲区国产区| jizzjizz中国精品麻豆| 亚洲精品动态| 欧美日韩国产一区二区三区不卡| 国产精品天堂蜜av在线播放| 日韩天堂av| a天堂资源在线|