前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
简介
模块方法模式,个人理解,首先模块方法需要有final,即该方法里面执行顺序不可改变,但是模块方法里面的字方法允许执行abstract方法。即abstact方法可以根据不同情况改变。
需求
用模块方法模式写一个泡茶和泡咖啡的例子
开发
需求分析
/**
* 制作一份饮料的流程顺序是
* 1.boilWater
* 2.addBeverage
* 3.pourInCup
* 4.addCondiments
* <p/>
* 其中addBeverage和addCondiments未抽象方法的原因:
* 不同饮料的这个两个方法是不一样的,故抽象化,并由对应之类实现
* <p/>
* 上述的特点就是模块方法的特点,即保持模块方法流程顺序,个别子方法按需重写实现
*/
public final void prepareRecipe() {
boilWater();
addBeverage();
pourInCup();
addCondiments();
}
模块方法的基类或超类
package TemplateMethodPattern;
public abstract class MakeDrink {
/**
* 制作一份饮料的流程顺序是
* 1.boilWater
* 2.addBeverage
* 3.pourInCup
* 4.addCondiments
* <p/>
* 其中addBeverage和addCondiments未抽象方法的原因:
* 不同饮料的这个两个方法是不一样的,故抽象化,并由对应之类实现
* <p/>
* 上述的特点就是模块方法的特点,即保持模块方法流程顺序,个别子方法按需重写实现
*/
public final void prepareRecipe() {
boilWater();
addBeverage();
pourInCup();
addCondiments();
}
/**
* 烧水
*/
private void boilWater() {
System.out.print("boilWater");
}
/**
* 加入饮料的主料
*/
protected abstract void addBeverage();
/**
* 倒入杯子
*/
private void pourInCup() {
}
/**
* 加入辅料
*/
protected abstract void addCondiments();
}
泡咖啡
package TemplateMethodPattern;
public class MakeCoffeeDrink extends MakeDrink {
@Override
protected void addBeverage() {
System.out.print("coffee");
}
@Override
protected void addCondiments() {
System.out.print("sugar and milk");
}
}
泡茶
package TemplateMethodPattern;
/**
* Created by Fadi.Su on 2017/11/25.
*/
public class MakeTeaDrink extends MakeDrink {
@Override
protected void addBeverage() {
System.out.print("Tea");
}
@Override
protected void addCondiments() {
System.out.print("Lemon");
}
}
结语
看设计模式的书,感觉很多情况下,还不如看代码理解快些,代码语言其实是国际通用的,很多情况下书本上的语言只是辅助理解。目前主要接触下这个需求场景及其所用到的设计模式。到时候根据对应的场景模块,适当地套用设计模式。