Template Method
Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为。
使用场景
1 多个子类有公有的方法,且逻辑基本相同
2 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则有各个子类实现。
3 重构时模板方法模式是一个经常使用的模式,把相同的代码抽取到父类,然后通过钩子函数(决定模板方法走位的方法)约束其行为。
上代码:
public abstract class MakeJuice {
protected abstract void cutFruit();
protected abstract void pressJuice();
protected abstract void putInCup();
protected abstract void putSugar();
final public void make(){
this.cutFruit();
this.pressJuice();
this.putInCup();
if(whetherPutSugar()){
this.putSugar();
}
}
protected boolean whetherPutSugar(){
return true;
}
}
public class MakeAppleJuice extends MakeJuice{
private boolean wetherPutSugar = true;
@Override
protected void cutFruit() {
System.out.println("切苹果");
}
@Override
protected void pressJuice() {
System.out.println("榨苹果汁");
}
@Override
protected void putInCup() {
System.out.println("放在陶瓷杯里");
}
@Override
protected void putSugar() {
System.out.println("放白砂糖");
}
@Override
protected boolean whetherPutSugar() {
return this.wetherPutSugar;
}
public void setPutSugarOrNot(boolean wetherPutSugar){
this.wetherPutSugar = wetherPutSugar;
}
}
public class MakeOrangeJuice extends MakeJuice{
private boolean wetherPutSugar = true;
@Override
protected void cutFruit() {
System.out.println("切橘子");
}
@Override
protected void pressJuice() {
System.out.println("榨橘汁");
}
@Override
protected void putInCup() {
System.out.println("放在玻璃杯里");
}
@Override
protected void putSugar() {
System.out.println("放橙子味糖");
}
@Override
protected boolean whetherPutSugar() {
return this.wetherPutSugar;
}
public void setPutSugarOrNot(boolean wetherPutSugar){
this.wetherPutSugar = wetherPutSugar;
}
}