模板方法设计模式

模板方法模式包含以下主要角色。

(1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。

① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

② 基本方法:是整个算法中的一个步骤,包含以下几种类型。

  • 抽象方法:在抽象类中申明,由具体子类实现。
  • 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。


(2) 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

模板方法模式的结构图如图 1 所示。

模板方法模式的结构图
图1 模板方法模式的结构图

代码:

package templateMethod;
public class TemplateMethodPattern
{
    public static void main(String[] args)
    {
        AbstractClass tm=new ConcreteClass();
        tm.TemplateMethod();
    }
}
//抽象类
abstract class AbstractClass
{
    public void TemplateMethod() //模板方法
    {
        SpecificMethod();
        abstractMethod1();          
        abstractMethod2();
    }  
    public void SpecificMethod() //具体方法
    {
        System.out.println("抽象类中的具体方法被调用...");
    }   
    public abstract void abstractMethod1(); //抽象方法1
    public abstract void abstractMethod2(); //抽象方法2
}
//具体子类
class ConcreteClass extends AbstractClass
{
    public void abstractMethod1()
    {
        System.out.println("抽象方法1的实现被调用...");
    }   
    public void abstractMethod2()
    {
        System.out.println("抽象方法2的实现被调用...");
    }
}

例子:

//模板方法设计模式:
//父类定义一个操作算法中的框架,而将其中的一些步骤延迟加载到子类中。
//它的本质就是固定算法框架。

//模板类
abstract class OperatorTimeTemplate
{
    public final long totalTime()
    {
        long begin = System.currentTimeMillis();
        doWork();
        long end = System.currentTimeMillis();
        return end - begin;
    }
    abstract void doWork();//模板方法
}
// 类 StringOperator 继承自 Template
class StringOperator extends OperatorTimeTemplate
{
    void doWork()
    {
        String str = "";
        for(int i=0; i<100000; ++i)
        {
            str += 1;
        }
    }
}
// 类 IntOperator 继承自 Template
class IntOperator extends OperatorTimeTemplate
{
    void doWork()
    {
        int sum = 0;
        for(int i=0; i<100000; ++i)
        {
            sum += 1;
        }
    }
}

//模板方法设计模式
public class TemplateMethodDemo
{
    public static void main(String[] args)
    {
        System.out.println(new StringOperator().totalTime());
        System.out.println(new IntOperator().totalTime());
    }
}
View Code

 

posted @ 2020-02-24 17:41  htj10  阅读(161)  评论(0编辑  收藏  举报
TOP