模板模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板模式较为简单,将同公用方法抽取出来形成一个抽象类,不同方法提供方法在子类覆盖,使用的是继承。
public abstract class RereshBaverage {
/**
* 制备饮料的模板方法
* 封装了所有子类共同遵守的算法骨架
*/
public final void prepreBvergeTemplage(){
//步骤一 将水煮沸
boilWater();
//步骤二 炮制饮料
brew();
//步骤三 将饮料倒入杯中
pourInCup();
//步骤四 加入调味料
addCondiments();
}
/**
* 基本方法,将水煮沸 这对所有子类而言是一个共同的行为,所以声明为private,无需向子类开放
*/
private void boilWater(){
System.out.println("将水煮沸");
}
/**
* 抽象的基本方法 泡制饮料
* 在算法框架中并不知道具体实现是什么样子的,所以做成了抽象方法,并且由于我们需要在子类中可见,便于复写而提供具体的实现所以将
* 权限设置为protected
*/
protected abstract void brew();
private void pourInCup(){
System.out.println("将饮料倒入杯中");
}
/**
* 加入调味料
*/
protected abstract void addCondiments();}
子类实现咖啡
public class Coffee extends RereshBaverage {
@Override
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加入糖和牛奶");
}
}
子类实现茶
public class Tea extends RereshBaverage {
@Override
protected void brew() {
System.out.println("用80 度的热水浸泡茶叶5分钟");
}
@Override
protected void addCondiments() {
System.out.println("加入柠檬");
}
}
还可以加上钩子函数控制公共方法:
模板方法模式的适用场景:
(1)算法或操作遵循相似的逻辑
(2)重构时(把相同的代码提取到父类中)
(3)重要复杂的算法,核心算法设计为模板方法
模板方法模式的优点:1.封装性好 2.复用性好 3.屏蔽细节 4.便于维护
模板模式与策略模式有相似也有不同,个人觉得策略模式更抽象没有具体实现,模板模式部分抽象。