设计模式之模板方法模式
一、模板方法模式是什么?
模板方法设计模式主要是对于一些有共同行为的算法或程序抽取相同代码,定义一个框架或执行步骤,而不同的操作交给子类去实现。
例如酒店后厨做菜分为下菜单、做菜、上菜。 整个过程中下菜单跟上菜是相同的,唯一的区别的每个菜中间的做菜的环节不同。我们就可以定义一个下菜单的父类模板,然后做菜交给每个子类去实现。
二、模板方法模式详解
1.模板方法模式组成
- 抽象类/抽象模板:抽象模板类,负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。
- 具体子类/具体实现:具体实现类,实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
2.示例demo
下面是代码的简要实现:
父类代码:
public abstract class CookingTemplate {
public void Cooking(String name){
//接菜单
acceptMenu(name);
//做菜
Food food = doCooking(name);
//上菜
serveDish((food));
}
public void acceptMenu(String name){
System.out.println("接收了XXX菜单............");
}
public void serveDish(Food food){
System.out.println("装盘子上XX菜.........");
}
abstract Food doCooking(String name);
}
炒土豆丝
public class FriedPotato extends CookingTemplate{
@Override
Food doCooking(String name) {
Food food = cookingPotato();
return Food;
}
private Food cookingPotato(){
/**
* 进行了一系列的炒土豆丝操作最后做出了一盘土豆丝,土豆是食物的子类
*/
return new Potato();
}
}
炒鸡蛋
public class FriedEgg extends CookingTemplate{
@Override
Food doCooking(String name) {
Food food = cookingPotato();
return Food;
}
private Food cookingPotato(){
/**
* 炒了两个鸡蛋
*/
return new Egg();
}
}
调用
public static void main(String[] args) {
CookingTemplate friedEgg = new FriedEgg();
friedEgg.doCooking("来份炒鸡蛋");
CookingTemplate friedPotato = new FriedPotato();
friedPotato.doCooking("来份炒土豆丝");
}
上面做菜的例子就是个简单的模板方法设计模式,对于设计模式来说其实我们很多代码都用了模板方法设计模式,只不过大家没注意或者不了解模板方法设计模式。
总结
优点
- 代码可拔插的,可以随意扩展增加(减可能会影响其他代码),清晰明了,维护代码简单
缺点
- 代码太多,比如整个满汉全席得一堆子类。
策略模式和模板方法模式是比较相似的,区别是策略模式是通过实现接口来实现的,模板模式使用的是继承父类,模板方法模式针对的是一套算法,其中某个不同细节给子类去具体实现,策略模式是多套不同的算法,基本是没有多少冗余代码的。