设计模式(三)__模板方法设计模式
咳咳,上课。
起立。
老师再见。???
你们就这么希望老师走吗。。。。
好了,同学们,今天这节课给大家介绍一下设计模式的一种——模板方法设计模式。
那么什么是模板方法设计模式呢?
当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心。
模式中的角色:
①抽象类:实现了模板方法
②具体类:实现抽象类中的抽象方法
通过一个例子来让大家更容易理解。
当我们需要判断一段程序运行的时间的时候,程序如下:
1 class GetTime { 2 public void getTime() { 3 long start = System.currentTimeMillis(); 4 // 判断这个循环执行的时间 5 for (int y = 0; y < 1000; y++) { 6 System.out.println(y); 7 } 8 long end = System.currentTimeMillis(); 9 System.out.println("毫秒是:" + (end - start)); 10 } 11 }
可是,如果需要判断的那段程序不确定怎么办呢?
这时可以把那段程序抽取成一个方法,需要判断哪个程序,只需要修改这个方法即可。这种方式不好,当需求变更时,就需要修改这个类中的方法,违背了开闭原则,增加了开发成本,并且很容易出错。
那么我们可以把这个不确定的功能部分提取出来,通过抽象方法实现,当你需要判断哪段程序的时候,可以通过子类去复写实现。这样做把不变的功能移到超类,通过子类扩展新的功能,有助于扩展,修改,符合开闭原则。
代码如下:
1 abstract class GetTime { 2 public final void getTime() { // 此功能如果不需要复写,可加final限定 3 long start = System.currentTimeMillis(); 4 code(); // 不确定的功能部分,提取出来,通过抽象方法实现 5 long end = System.currentTimeMillis(); 6 System.out.println("毫秒是:" + (end - start)); 7 } 8 9 public abstract void code(); // 抽象不确定的功能,让子类复写实现 10 } 11 12 class Demo extends GetTime { 13 public void code() { // 子类复写功能方法 14 for (int y = 0; y < 1000; y++) { 15 System.out.println("y"); 16 } 17 } 18 }
这样做也是有缺点的,每个不同的实现都需要定义一个子类,这会导致类的个数的增加。
希望大家下去可以自行练习,把各种模式变成自己的习惯。
咳咳,下课
起立
老师再见