圖解Java設計模式之模板模式 豆漿製作問題 模板方法模式基本介紹 模板方法模式原理類圖 模板方法模式解決豆漿製作問題 模板方法模式的鉤子方法 模板方法模式在Spring框架中的源碼分析 模板方法模式的註意事項和細節 豆漿製作問題 1)製作豆漿的流程 選材 – 》添加配料 --》浸泡 --》放到豆漿 ...
圖解Java設計模式之模板模式
豆漿製作問題
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關鍵字,防止子類重寫模板方法。
- 模板方法模式使用場景 :當要完成在某個過程,該過程要執行一系列步驟,這一系列的步驟基本相同,但其個別步驟在實現時可能不同,通車考慮用模板方法模式來處理