温习下模板方法模式。模板方法中定义一个模板基类,将共性的部分在基类中实现,将拓展部分交给子类实现。也算是遵循对拓展开放,对修改关闭的原则。同时也可以定义一些开关给到子类做拓展。
package com.pattern.template;
/**
* 模板方法
* @author hcguo
*
*/
public abstract class DrinkTemplate {
/**
*准备饮料
*/
public final void prepareDrinkTemplate(){
/*
* step1煮水
*/
boilWater();
/*
* step2加入饮料颗粒或茶叶或其它冲剂到杯中
*/
addPowder();
/*
* step3导入水到饮料杯中
*/
putIntoCup();
/*
* step4用对应包装打包饮料
* 子类中可决定是否需要打包或者堂食
*/
if(NeedPackage()){
packageDrink();
}
}
protected boolean NeedPackage() {
return true;
}
/**
* 这是通用方法,无需子类重写
*/
private void boilWater() {
System.out.println("煮水");
}
/**
* 具体饮料加不同的饮料冲级,由子类实现
*/
protected abstract void addPowder();
/**
* 这是通用方法,无需子类重写
*/
private void putIntoCup() {
System.out.println("倒入杯中");
}
/**
* 不同的饮料打不通的包装,由子类实现
*/
protected abstract void packageDrink();
}
package com.pattern.template;
public class Coffee extends DrinkTemplate {
@Override
protected void addPowder() {
System.out.println("加入咖啡粉");
}
@Override
protected void packageDrink() {
System.out.println("用咖啡饮料包装打包咖啡");
}
@Override
protected boolean NeedPackage() {
return false;
}
}
package com.pattern.template;
public class OrangeJuice extends DrinkTemplate{ @Override
protected void addPowder() {
//现在的黑心商贩都是加冲剂,
System.out.println("加入橙子味冲剂");
}
@Override
protected void packageDrink() {
System.out.println("用装橙汁的包装打包橙汁");
}
}
package com.pattern.template;
public class TemplateTest {
public static void main(String args[]){
System.out.println("*******开始泡咖啡***********");
//泡咖啡
DrinkTemplate coffee = new Coffee();
coffee.prepareDrinkTemplate();
System.out.println("*******开始冲橙汁***********");
//冲橙汁
DrinkTemplate juice = new OrangeJuice();
juice.prepareDrinkTemplate();
}
}