电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

分析設(shè)計模式之模板方法Java實現(xiàn)

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

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

1.1、模板方法的用途 將不變的行為從子類搬到超類,去除了子類中的重復(fù)代碼 規(guī)范子類的結(jié)構(gòu)1.2、模板方法的定義

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

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

通常模板類是抽象類,負(fù)責(zé)給出算法的輪廓或者框架。他是有若干個模板方法和若干個基本方法構(gòu)成。

1.模板方法

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

2.基本方法

基本算法有三種類型:

​a) 抽象方法:子類必須重寫的方法。沒有默認(rèn)實現(xiàn)。

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

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

2.2、定義具體子類

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

2.3、定義客戶端調(diào)用

客戶端調(diào)用抽象類, 實例化的時候?qū)嵗唧w類, 只需要調(diào)用抽象類的模板方法就可以了。

2.4 下抽象類和子類之間的UML圖和源碼實現(xiàn)

1.UML圖

分析設(shè)計模式之模板方法Java實現(xiàn)

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

2.源碼

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

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

在定義具體的實現(xiàn)類, 實現(xiàn)父類的抽象方法

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

最后定義客戶端調(diào)用

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

運行結(jié)果:

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

具體實現(xiàn)類--重寫父類的抽象方法

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

三、案例3.1、案例1: 一日規(guī)劃

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

package com.lxl.www.designPatterns.templatePattern.oneDayArrangement;/** * 一日三餐抽象類 */public abstract class ArrangementAbstract { /** * 模板方法 * 規(guī)定了一天的框架 */ 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();}

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

一日安排實現(xiàn)類

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 + '--晚餐吃水果'); }}

客戶端調(diào)用

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

運行結(jié)果:

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

可以看出, 完全按照模板方法的步驟實現(xiàn)。

3.2、案例2: 鉤子方法

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

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

UML圖:

分析設(shè)計模式之模板方法Java實現(xiàn)

源代碼:

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

定義具體實現(xiàn)

/** * 具體實現(xiàn)類 */public class ConcreteClass extends AbstractClass { /** * 重寫父類的抽象方法 */ @Override public void abstractMethod() {System.out.println('具體實現(xiàn)類--重寫父類的抽象方法'); } /** * 鉤子方法 * @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(); }}

運行結(jié)果

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

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

四、模板方法的優(yōu)缺點4.1、優(yōu)點

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

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

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

4.2、缺點

1.每一種實現(xiàn)都需要定義一個具體實現(xiàn)類, 增加類的數(shù)量, 系統(tǒng)更加復(fù)雜。

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

3.父類中的抽象方法由子類實現(xiàn), 子類的執(zhí)行結(jié)果影響父類, 這種'反向控制'結(jié)構(gòu), 會增加代碼的復(fù)雜性。

五、使用場景

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

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

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

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

六、對設(shè)計模式六大原則的應(yīng)用思考

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

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

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

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

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

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

以上就是分析設(shè)計模式之模板方法的詳細(xì)內(nèi)容,更多關(guān)于設(shè)計模式 模板方法的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 低温等离子清洗机(双气路进口)-嘉润万丰 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 中山市派格家具有限公司【官网】 | 浙江美尔凯特智能厨卫股份有限公司| 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 北京燃气公司 用户服务中心 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 污水处理设备-海普欧环保集团有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! |