模板方法模式:
定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作
以提供具体行为
意图:定义了一个在操作中的一个算法框架,把一些步骤推迟到子类去实现,模板方法
模式让子类不不要改变算法结构而重新定义特定的算法步骤
1 package templatedemo; 2 3 public class TemplateDemo { 4 5 /** 6 * 模板方法模式 示例 7 * 8 * @param args 9 */ 10 public static void main(String[] args) { 11 Teacher t1 = new DBTeacher(); 12 System.out.println("--------数据库老师上课-------"); 13 t1.work();// 父类引用变量指向子类对象,调用prepared 方法和end方法时,直接调用的是父类的 14 // 而调用teaching方法时,调用的是具体子类对象的重写了父类的teaching方法 15 Teacher t2 = new CTeacher(); 16 System.out.println("--------C语言老师上课--------"); 17 t2.work(); 18 } 19 } 20 21 abstract class Teacher { 22 // 老师工作的方法,是一个流程,分若干步骤,即一个模板方法,这个模板的先后顺序已经固定,不能改变 23 // 比如,授课前准备和授课结束这两个方法都是一样的,可以在父类中直接定义好,子类继承后直接使用, 24 // 但是teaching这个方法每个老师是不同的,这时就应该延迟到让Teacher的子类去实现 25 // 也就是通用的,放在父类中定义好,不通用的,让子类去定义 26 public void prepared() { 27 System.out.println("准备好白板笔"); 28 System.out.println("打开投影仪"); 29 } 30 31 public void end() { 32 System.out.println("关闭投影仪"); 33 System.out.println("锁教室门"); 34 } 35 36 public abstract void teaching(); 37 38 // 一个方法只需要做方法的声明,这个方法就需要被定义为抽象方法,这个类要定义为抽象类 39 // 模板方法,分3个步骤 40 public void work() { 41 // 1 授课前准备 42 prepared();// 调用本类的方法 43 // 2 进行授课 44 teaching(); 45 // 授课结束 46 end(); 47 } 48 } 49 50 class DBTeacher extends Teacher { 51 // 重写父类的抽象方法 52 public void teaching() { 53 System.out.println("打开Oracle"); 54 System.out.println("书写pl-sql指令"); 55 System.out.println("优化pl-sql指令"); 56 } 57 } 58 59 class CTeacher extends Teacher { 60 61 @Override 62 // 重写父类的抽象方法 63 public void teaching() { 64 System.out.println("打开VM"); 65 System.out.println("书写C指令"); 66 System.out.println("调试C程序"); 67 } 68 }