突破极限,突破局限,黑色之路,默默走完...

每个人都依靠自己的知识和认识,却又被之所束缚,还将这些称之为现实。但知识和认识是非常暧昧的东西,那个现实也许只不过是镜中花水中月。人们都生活在自我意识之中,你不这么认为吗?...

Java模板模式(Template模式)

模板方法
 概述
    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
    
    TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
 适用性
    1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

    2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
      首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
      最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

    3.控制子类扩展。
			
 参与者
    1.AbstractClass
      定义抽象的原语操作(primitiveoperation),具体的子类将重定义它们以实现一个算法的各步骤。
      实现一个模板方法,定义一个算法的骨架。
      该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。

    2.ConcreteClass
      实现原语操作以完成算法中与特定子类相关的步骤。
 类图
 例子
AbstractClass
public abstract class Template {

    public abstract void print();
    
    public void update() {
        System.out.println("开始打印");
        for (int i = 0; i < 10; i++) {
            print();
        }
    }
}
ConcreteClass
public class TemplateConcrete extends Template {

    @Override
    public void print() {
        System.out.println("这是子类的实现");
    }
}
Test
public class Test {

    public static void main(String[] args) {
        Template temp = new TemplateConcrete();
        temp.update();
    }
}
result
开始打印
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现
这是子类的实现


Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。

其实Java的抽象类本来就是Template模式,因此使用很普遍。而且很容易理解和使用,我们直接以示例开始:
public abstract class Benchmark
{
  /**
  * 下面操作是我们希望在子类中完成
  */
  public abstract void benchmark();

  /**
  * 重复执行benchmark次数
  */
  public final long repeat (int count) {
    if (count <= 0)
      return 0;
    else {
      long startTime = System.currentTimeMillis();
            for (int i = 0; i < count; i++)
          benchmark();
                long stopTime = System.currentTimeMillis();
                return stopTime - startTime;
          }
        }
}


在上例中,我们希望重复执行benchmark()操作,但是对benchmark()的具体内容没有说明,而是延迟到其子类中描述:
public class MethodBenchmark extends Benchmark
{
  /**
  * 真正定义benchmark内容
  */
  public void benchmark() {
    for (int i = 0; i < Integer.MAX_VALUE; i++){
      System.out.printtln("i="+i);    
       }
  }
}


至此,Template模式已经完成,是不是很简单?看看如何使用:
    Benchmark operation = new MethodBenchmark();
    long duration = operation.repeat(Integer.parseInt(args[0].trim()));
    System.out.println("The operation took " + duration + " milliseconds");

也许你以前还疑惑抽象类有什么用,现在你应该彻底明白了吧?至于这样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个继承子类就可以,不必修改其他应用代码。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27073205/article/details/46779375
个人分类: 设计模式
上一篇Android之自定义(上方标题随ViewPager手势慢慢滑动)
下一篇android 百分比控件的使用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭