模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
类图:
我们把做菜分为洗菜,切菜,做菜,上菜四个步骤,我们用模板方法模式来实现做红烧鱼和做辣子鸡丁。
类图:
模板类Cook代码实现:
public abstract class Cook {
public void Cook(){
Wash();
Cut();
Cooking();
Dish();
}
public void Wash(){
System.out.println("洗菜");
}
public abstract void Cut();
public abstract void Cooking();
public void Dish(){
System.out.println("上菜");
}
}
CookFish类代码实现:
public class CookFish extends Cook{
@Override
public void Cut() {
// TODO Auto-generated method stub
System.out.println("在鱼背上划几刀,方便入味");
}
@Override
public void Cooking() {
// TODO Auto-generated method stub
System.out.println("先煎至两面金黄出锅,后做汤汁,最后收汁出锅");
}
public void Wash(){
System.out.println("洗鱼,去鳞");
}
}
CookChicken类代码实现:
public class CookChicken extends Cook{
@Override
public void Cut() {
// TODO Auto-generated method stub
System.out.println("用刀切成鸡丁");
}
@Override
public void Cooking() {
// TODO Auto-generated method stub
System.out.println("加入葱姜蒜辣子爆炒");
}
public void Wash(){
System.out.println("洗鸡");
}
}
Client类代码实现:
public class Client {
public static void main(String[] args){
CookFish cookFish = new CookFish();
CookChicken cookChicken = new CookChicken();
System.out.println("\n做一条红烧鱼...");
cookFish.Cook();
System.out.println("\n做一个辣子鸡丁...");
cookChicken.Cook();
}
}
运行结果:
做一条红烧鱼...
洗鱼,去鳞
在鱼背上划几刀,方便入味
先煎至两面金黄出锅,后做汤汁,最后收汁出锅
上菜
做一个辣子鸡丁...
洗鸡
用刀切成鸡丁
加入葱姜蒜辣子爆炒
上菜
总结:
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法模式为我们提供了一种代码复用的重要技巧。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,或者只做默认的事,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模板方法的一种特殊版本。