目錄
模板模式的定義
模板模式的實現(xiàn)
模板模式角色
模板模式類圖
模板模式舉例
模板模式代碼實現(xiàn)
模板模式的特點(diǎn)
優(yōu)點(diǎn)
缺點(diǎn)
使用場景
注意事項
實際應(yīng)用
模板模式的定義
????????模板模式(Template Pattern)屬于行為型設(shè)計模式,又叫模版方法模式(Template Method Pattern),是指定義一個算法的骨架,并允許子類為一個或多個步驟提供實現(xiàn)。模板模式使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。
????????模板模式,其主要的的思想就是做一個模板,提供給客戶端進(jìn)行調(diào)用。除去生活中我們經(jīng)常用到的簡歷模板、合同模板等等,Java中也有很經(jīng)典的模板使用,那就是Servlet,HttpService類提供了一個service()方法,這個方法調(diào)用七個do方法中的一個或幾個,完成對客戶端調(diào)用的響應(yīng)。這些do方法需要由HttpServlet的具體則由子類提供。
模板模式的實現(xiàn)
模板模式角色
- 抽象模板角色(Abstract Template):定義了一個或多個抽象操作,即定義了算法的骨架,以便讓子類實現(xiàn)。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟;定義并實現(xiàn)了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到子類實現(xiàn)。頂級邏輯也有可能調(diào)用一些具體方法。
- 具體模板角色(Concrete Template):實現(xiàn)父類所定義的一個或多個抽象方法,即不同的對象的具體實現(xiàn)細(xì)節(jié),它們是一個頂級邏輯的組成步驟;每一個抽象模板角色都可以有任意多個具體模板角色與之對應(yīng),而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現(xiàn),從而使得頂級邏輯的實現(xiàn)各不相同。
模板模式類圖
模板模式舉例
????????相信大家都吃過水果蛋糕,不過無論造型如何變化,不變的有兩種東西:“奶油”和“面包”。其余的水果材料隨意搭配,就湊成了各式各樣的水果蛋糕?;谶@個場景,寫一個案例,進(jìn)一步了解下模板模式;創(chuàng)建三個類:Cake(蛋糕)、StrawberryCake(草莓蛋糕)、MangoCake(芒果蛋糕)。最后創(chuàng)建一個Client類,實現(xiàn)這個制作蛋糕的調(diào)用過程。
模板模式代碼實現(xiàn)
抽象模版角色
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
* @version 1.0
* @desc 抽象模版角色 蛋糕
* @date 2023/08/09 13:44:38
*/
public abstract class Cake {
/**
* 制作
*/
public void make() {
System.out.println("開始準(zhǔn)備材料。");
bread();
cream();
fruit();
System.out.println("經(jīng)過一系列的操作。");
System.out.println("制作完成。");
}
/**
* 準(zhǔn)備面包
*/
public void bread() {
System.out.println("準(zhǔn)備材料:面包");
}
/**
* 準(zhǔn)備奶油
*/
public void cream() {
System.out.println("準(zhǔn)備材料:奶油");
}
/**
* 準(zhǔn)備水果
*/
protected abstract void fruit();
}
具體模版角色
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
* @version 1.0
* @desc 具體模版角色:芒果蛋糕
* @date 2023/08/09 13:46:07
*/
public class MangoCake extends Cake{
@Override
protected void fruit() {
System.out.println("準(zhǔn)備材料:芒果");
}
}
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
* @version 1.0
* @desc 具體模版角色:草莓蛋糕
* @date 2023/08/09 13:46:07
*/
public class StrawberryCake extends Cake{
@Override
protected void fruit() {
System.out.println("準(zhǔn)備材料:草莓");
}
}
測試代碼
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
* @version 1.0
* @desc 測試類
* @date 2023/08/09 13:48:06
*/
public class Test {
public static void main(String[] args) {
Cake c1 = new MangoCake();
c1.make();
Cake c2 = new StrawberryCake();
c2.make();
}
}
測試截圖?
文章來源:http://www.zghlxwxcb.cn/news/detail-635818.html
模板模式的特點(diǎn)
優(yōu)點(diǎn)
- 提高代碼復(fù)用性:模板模式將公共的算法提取到父類中,子類只需關(guān)注實現(xiàn)自己特定的步驟,提高了代碼的復(fù)用性。
- 保持一致的算法結(jié)構(gòu):模板模式定義了算法的框架,保持了一致的算法結(jié)構(gòu),使得代碼更加整潔和可讀。
- 靈活性:子類可以根據(jù)需要重寫或擴(kuò)展父類中的某些算法步驟,從而實現(xiàn)定制化的算法。
缺點(diǎn)
- 某些步驟的實現(xiàn)可能受限:由于模板模式是通過繼承來實現(xiàn)的,因此可能會限制某些步驟的具體實現(xiàn)方式。
- 增加了類的數(shù)量:使用模板模式會增加父類和子類的數(shù)量,可能導(dǎo)致類的層次結(jié)構(gòu)較為復(fù)雜。
使用場景
- 當(dāng)有一組相似的算法,其具體實現(xiàn)步驟相同或類似,只有某些步驟的實現(xiàn)有差異時,可以考慮使用模板模式。
- 當(dāng)需要保持一致的算法結(jié)構(gòu),提高代碼復(fù)用性和可維護(hù)性時,可以使用模板模式。
注意事項
- 抽象出公共的算法框架:在使用模板模式時,需要抽象出算法的公共框架,并將可變的部分延遲到子類中實現(xiàn)。
- 父類對于子類的要求:父類中定義的模板方法可以使用鉤子方法來約束子類的行為。
- 為防止惡意操作:一般模板方法都加上 final 關(guān)鍵詞
實際應(yīng)用
- 數(shù)據(jù)庫訪問操作:數(shù)據(jù)庫訪問操作中的連接、查詢和關(guān)閉等操作可以使用模板模式,將通用的操作提取到父類中,而具體的查詢可以由子類來實現(xiàn)。
- 游戲開發(fā)中的關(guān)卡設(shè)計:在游戲開發(fā)中,不同的關(guān)卡可能有相同的初始化、更新和結(jié)束等步驟,可以使用模板模式來實現(xiàn)這些關(guān)卡。
更多消息資訊,請訪問昂焱數(shù)據(jù)(https://www.ayshuju.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-635818.html
到了這里,關(guān)于設(shè)計模式行為型——模板模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!