码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(三)__模板方法设计模式

时间:2015-10-02 17:20:26      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

咳咳,上课。  

起立。

老师再见。???

你们就这么希望老师走吗。。。。

好了,同学们,今天这节课给大家介绍一下设计模式的一种——模板方法设计模式。

  那么什么是模板方法设计模式呢?

  当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

  模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心。

  模式中的角色:

  ①抽象类:实现了模板方法

  ②具体类:实现抽象类中的抽象方法

  通过一个例子来让大家更容易理解。

  当我们需要判断一段程序运行的时间的时候,程序如下:

 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 }

这样做也是有缺点的,每个不同的实现都需要定义一个子类,这会导致类的个数的增加。

希望大家下去可以自行练习,把各种模式变成自己的习惯。

咳咳,下课

起立

老师再见

 

设计模式(三)__模板方法设计模式

标签:

原文地址:http://www.cnblogs.com/makaruila/p/4852371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!