项目背景
项目经理小王同学接手了一个新的项目,关于校内的一个饮品店,里面卖的有各种咖啡,茶等等。由于这个相比比较的简单,它就将这个分配给了小李同学,于是小李同学设计了一下项目的架构。
代码展示
public class Coffee { public void prepareRecipe(){ boilWater(); brew(); pourInCup(); addCondiments(); } private void addCondiments() { System.out.println("加糖加牛奶"); } private void pourInCup() { System.out.println("把咖啡倒入杯子中"); } private void brew() { System.out.println("冲泡咖啡"); } private void boilWater() { System.out.println("烧热水!"); } } public class Tea { public void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } private void addCondiments() { System.out.println("加柠檬"); } private void pourInCup() { System.out.println("把茶叶倒入杯子中"); } private void brew() { System.out.println("冲泡茶叶"); } private void boilWater() { System.out.println("烧热水!"); } } public class Client { public static void main(String[] args) { System.out.println("============coffee==========="); Coffee coffee = new Coffee(); coffee.prepareRecipe(); System.out.println("============tea==========="); Tea tea = new Tea(); tea.prepareRecipe(); } }
运行结果
============coffee=========== 烧热水! 冲泡咖啡 把咖啡倒入杯子中 加糖加牛奶 ============tea=========== 烧热水! 冲泡茶叶 把茶叶倒入杯子中 加柠檬
小李同学弄完之后满心欢喜的去找小王经理汇报工作,他看了看代码,什么也没说。。。。之间手指在键盘飞速敲击,不久后。。。。
public abstract class HotDrink { public final void prepareRecipe(){ boilWater(); brew(); pourInCup(); addCondiments(); } public abstract void addCondiments(); public void pourInCup() { System.out.println("把原料倒入杯子中"); } public abstract void brew(); public void boilWater() { System.out.println("烧热水!"); } } public class Tea extends HotDrink{ @Override public void addCondiments() { System.out.println("加柠檬"); } @Override public void brew() { System.out.println("冲泡茶叶"); } } public class Coffee extends HotDrink{ @Override public void addCondiments() { System.out.println("加糖 加牛奶"); } @Override public void brew() { System.out.println("冲泡咖啡"); } }
就对代码进行了重构,因为这两个实体具体执行的步骤都是四步,并且流程都是统一的,所以定义一个公共的父类,把他们的流程和一样的方法抽象出来,这样就提高了代码的复用性,小李同学看完之后觉得有一种恍然大悟的感觉,不禁觉得自己要学的东西还很多,忙说谢谢您的指导。于是就引出了模板模式的定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。
模板模式的优点:
一 | 具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。 |
二 | 代码复用的基本技术,在数据库设计中尤为重要。 |
三 | 存在一种反向的控制结构,通过一个父类调用其子类的操作,通过子类对父类进行扩展增加新的行为,符合“开闭原则”。 |