模板模式Template
存在意義
完成一件事情,有固定的數個步驟,但是每個步驟根據對象的不同,而實現細節不同;就可以在父類中定義一個完成該事情的總方法,按照完成事件需要的步驟去調用其每個步驟的實現方法。每個步驟的具體實現,由子類完成。
抽象父類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,即不同的對象的具體實現細節。
代碼實現
- 舉例: 比如我們做菜可以分爲三個步驟 (1)備料 (2)具體做菜 (3)盛菜端給客人享用,這三部就是算法的骨架 ;然而做不同菜需要的料,做的方法,以及如何盛裝給客人享用都是不同的這個就是不同的實現細節。
/**
* 做菜3步驟: 1.備料 2.做菜 3.給客戶享用
*
* @title
* @description
* @since JDK1.8
*/
public abstract class DodishTemplate {
/**
*
* 做菜三部曲
*
* @authz Fan.W
* @createtime 2018年1月7日 下午10:25:40
*/
protected void dodish() {
this.preparation();
this.doing();
this.serverDish();
}
/**
*
* 備料
*
* @authz Fan.W
* @createtime 2018年1月7日 下午10:24:35
*/
public abstract void preparation();
/**
*
* 開始做菜
*
* @authz Fan.W
* @createtime 2018年1月7日 下午10:24:43
*/
public abstract void doing();
/**
*
* 給客人享用
*
* @authz Fan.W
* @createtime 2018年1月7日 下午10:24:52
*/
public abstract void serverDish();
}
/**
* 西紅柿炒雞蛋
*
* @title
* @description
* @since JDK1.8
*/
public class EggsAndTomato extends DodishTemplate {
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#preparation()
*/
@Override
public void preparation() {
System.out.println("洗西紅柿,打雞蛋");
}
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#doing()
*/
@Override
public void doing() {
System.out.println("雞蛋倒入鍋裏,然後把西紅柿也倒進去,一起炒");
}
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#serverDish()
*/
@Override
public void serverDish() {
System.out.println("炒好之後給,放在盤子裏,端給客人");
}
}
/**
* 紅燒肉
*
* @title
* @description
* @since JDK1.8
*/
public class Hongshaorou extends DodishTemplate {
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#preparation()
*/
@Override
public void preparation() {
System.out.println("先切豬肉和土豆");
}
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#doing()
*/
@Override
public void doing() {
System.out.println("將切好的豬肉和土豆放到鍋裏 ,開始炒");
}
/*
* (非 Javadoc)
*
* @see com.example.demo.template.DodishTemplate#serverDish()
*/
@Override
public void serverDish() {
System.out.println("將炒好的紅燒肉放到盤子裏面,端給客人");
}
}
/**
* 模板模式測試類
*
* @title
* @description
* @since JDK1.8
*/
public class Main {
public static void main(String[] args) {
EggsAndTomato et = new EggsAndTomato();
et.dodish();
System.out.println("======================================================");
Hongshaorou hsr = new Hongshaorou();
hsr.dodish();
}
}
結果打印:
洗西紅柿,打雞蛋
雞蛋倒入鍋裏,然後把西紅柿也倒進去,一起炒
炒好之後給,放在盤子裏,端給客人
======================================================
先切豬肉和土豆
將切好的豬肉和土豆放到鍋裏 ,開始炒
將炒好的紅燒肉放到盤子裏面,端給客人
優點和缺點
模板模式的優點
(1)具體細節步驟實現定義在子類中,子類定義詳細處理算法是不會改變算法整體結構。
(2)代碼複用的基本技術,在數據庫設計中尤爲重要。
(3)存在一種反向的控制結構,通過一個父類調用其子類的操作,通過子類對父類進行擴展增加新的行爲,符合“開閉原則”。
不足
每個不同的實現都需要定義一個子類,會導致類的個數增加,系統更加龐大。