设计模式-模板模式
1- 官方定义:
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2- 白话理解:
在做一些事情的时候有固定的步骤,但是每一步的具体操作都会根据具体的对象不同而不同;这样就可以向上抽取一个父类定义一个完成这件事的总方法,在这个总方法中安装步骤调用每个步骤的实现方法。但是每个步骤的具体实现由不同的子类去实现。
3- 模板模式的类图
抽象父类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,即不同的对象的具体实现细节。
4- 例子:
做菜我需要分为三步:1-准备食材;2-炒菜;3-上菜。这三步就是做菜的模板,但是不同的参需要的食材不一样,做法也不一样,以及上菜的方式也不一样。所以需要一个模板定义一个骨架(做菜),调用这三个步骤的方法,而这三个步骤的具体实现由这个模板的子类去完成;
代码:
模板类
public abstract class DodishTemplate { /** * 定义一个总的模板做菜,调用三步骤的方法 */ public final void dodish(){ //1- 准备食材 this.preparation(); //2- 炒菜 this.doing(); //3- 上菜 this.carriedDishes(); } /** * 步骤一:准备食材 */ public abstract void preparation(); /** * 步骤二:炒菜 */ public abstract void doing(); /** * 步骤三:上菜 */ public abstract void carriedDishes(); }
番茄炒蛋类:
/** * Created by Administrator on 2018/6/1. * 番茄炒蛋 * 1- 每一道菜都一个实体类并继承做菜的模板类 * 2- 重写做菜模板类中的做菜三步骤的方法 * */ public class EggsWithTomato extends DodishTemplate { @Override public void preparation() { System.out.println("准备番茄和鸡蛋。"); } @Override public void doing() { System.out.println("先炒鸡蛋,然后将番茄倒入锅中翻炒!"); } @Override public void carriedDishes() { System.out.println("用小碟子装番茄炒蛋。"); } }
红烧肉类:
/** * Created by Administrator on 2018/6/1. * 红烧肉 * 1- 每一道菜都一个实体类并继承做菜的模板类 * 2- 重写做菜模板类中的做菜三步骤的方法 */ public class Bouilli extends DodishTemplate { @Override public void preparation() { System.out.println("准备土豆和猪肉。"); } @Override public void doing() { System.out.println("将切好的猪肉倒入锅中炒一会然后倒入土豆连炒带炖。"); } @Override public void carriedDishes() { System.out.println("将做好的红烧肉盛进碗里端给客人吃。"); } }
测试方法:
private static void testTemplateMode() { EggsWithTomato eggsWithTomato = new EggsWithTomato(); eggsWithTomato.dodish(); System.out.println("---------------------------"); Bouilli bouilli = new Bouilli(); bouilli.dodish(); }
结果:
准备番茄和鸡蛋。
先炒鸡蛋,然后将番茄倒入锅中翻炒!
用小碟子装番茄炒蛋。
---------------------------
准备土豆和猪肉。
将切好的猪肉倒入锅中炒一会然后倒入土豆连炒带炖。
将做好的红烧肉盛进碗里端给客人吃。
5- 模板设计模式步骤:
a- 父类为抽象类;(必须)
b- 父类中的总方法或某个步骤的操作完全一样的方法使用final 修饰(以免子类重写该方法)(选择)
c- 父类中每个步骤的小方法定义为抽象的方法;(必须)
d- 子类继承父类并重写父类中的抽象方法;(必须)