圖解Java設計模式之模板模式
- 豆漿制作問題
- 模板方法模式基本介紹
- 模板方法模式原理類圖
- 模板方法模式解決豆漿制作問題
- 模板方法模式的鉤子方法
- 模板方法模式在Spring框架中的原始碼分析
- 模板方法模式的注意事項和細節
豆漿制作問題
1)制作豆漿的流程 選材 – 》添加配料 --》浸泡 --》放到豆漿機打碎
2)通過添加不同的配料,可以制作出不同口味的豆漿
3)選材、浸泡和放到豆漿機打碎這幾個步驟對于每種口味的豆漿都是一樣的
4)模版方法模式比較簡單,很容易就想到這個方案,因此就直接使用,
模板方法模式基本介紹
1)模板方法模式(Template Method Pattern),又叫做模板模式(Template Pattern),在一個抽象類定義類執行它的方法的模版,它的子類可以按需要重寫方法實作,但呼叫將以抽象類中定義的方式進行,
2)簡單來說,模板方法模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構,就可以重定義該演算法的某些特定步驟
3)這種型別的設計模式屬于行為型模式,
模板方法模式原理類圖

原理類圖的說明 :
1)AbstractClass抽象類,類中實作類模版方法(template),定義類演算法的骨架,具體子類需要去實作,其它的抽象方法operationr2,3,4,
2)ConcreteClass實作抽象方法 operationr2,3,4,以完成演算法中特點子類的步驟,
模板方法模式解決豆漿制作問題
1)應用實體要求
撰寫制作豆漿的程式,說明如下 :
制作豆漿的流程 選材 --》添加配料 --》浸泡 --》放到豆漿機打碎
通過添加不同的配料,可以制作出不同口味的豆漿
選材、浸泡和放到豆漿機打碎這幾個步驟對于制作每種口味的豆漿都是一樣的(紅豆、花生豆漿,,)
2)類圖
package com.example.demo.template;
/**
* 抽象類,表示豆漿
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk {
/**
* 模版方法,make,模版方法可以做成final,不讓子類去覆寫,
*/
final void make() {
select();
addCondiments();
soak();
beat();
}
/**
* 選材料
*/
void select() {
System.out.println("第一步 :選擇好的新鮮黃豆 ");
}
/**
* 添加不同的配料,抽象方法,子類具體實作
*/
abstract void addCondiments();
/**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黃豆和配料開始浸泡,需要3小時 ");
}
void beat() {
System.out.println("第四步 :黃豆和配料放到豆漿機去打碎 ");
}
}
package com.example.demo.template;
public class RedBeanSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的紅豆 ");
}
}
package com.example.demo.template;
public class PeanutSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的花生 ");
}
}
package com.example.demo.template;
public class Client {
public static void main(String[] args) {
// 制作紅豆豆漿
System.out.println("-- 制作紅豆豆漿 --");
SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("-- 制作花生豆漿 --");
SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
模板方法模式的鉤子方法
1)在模板方法模式的父類中,定義一個方法,它默認不做任何事,子類可以視情況要不要覆寫它,該方法稱為“鉤子”,
2)還是用上面做豆漿的例子來講解,比如,制作純豆漿,不添加任何的配料,使用鉤子方法對前面的模版方法進行改造,
package com.example.demo.template;
/**
* 抽象類,表示豆漿
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk {
/**
* 模版方法,make,模版方法可以做成final,不讓子類去覆寫,
*/
final void make() {
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
}
/**
* 選材料
*/
void select() {
System.out.println("第一步 :選擇好的新鮮黃豆 ");
}
/**
* 添加不同的配料,抽象方法,子類具體實作
*/
abstract void addCondiments();
/**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黃豆和配料開始浸泡,需要3小時 ");
}
void beat() {
System.out.println("第四步 :黃豆和配料放到豆漿機去打碎 ");
}
/**
* 鉤子方法,決定是否需要添加配料
* @return
*/
boolean customerWantCondiments() {
return true;
}
}
package com.example.demo.template;
public class PureSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
// 空實作
}
@Override
boolean customerWantCondiments() {
// TODO Auto-generated method stub
return false;
}
}
模板方法模式在Spring框架中的原始碼分析





下面這兩個是鉤子方法,默認空實作,讓子類去實作,

下面是子類實作的方法

模板方法模式的注意事項和細節
- 基本思想是 :演算法只存在于一個地方,也就是在父類中,容易修改,需要修改演算法時,只要修改父類的模板方法或者已經實作的某些步驟,子類就會繼承這些修改
- 實作類最大化代碼復用,父類的模板方法和已實作的某些步驟會被子類繼承而直接使用,
- 既統一了演算法,也提供類很大的靈活性,父類的模板方法確保類演算法的結構保持不變,同時由子類提供部分步驟的實作,
- 該模式的不足之處 :每一個不同的實作都需要一個子類實作,導致類的個數增加,使得系統更加龐大
- 一般模板方法都加final關鍵字,防止子類重寫模板方法,
- 模板方法模式使用場景 :當要完成在某個程序,該程序要執行一系列步驟,這一系列的步驟基本相同,但其個別步驟在實作時可能不同,通車考慮用模板方法模式來處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/19664.html
標籤:設計模式
上一篇:圖解Java設計模式之外觀模式
下一篇:圖解Java設計模式之命令模式
