• 模板方法设计模式


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

    (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

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    Collatz Conjecture(BAPC2017)
    P3377 【模板】左偏树(可并堆)
    Mergeable Stack
    B. Our Tanya is Crying Out Loud(cf)and 5918: 改变(中石油)
    bzoj 4488: [Jsoi2015]最大公约数
    Zoj
    牛客练习赛43 回顾
    哈尔滨工程大学ACM预热赛 补题
    April Fools Day Contest 2019: editorial回顾补题
    第一周总结
  • 原文地址:https://www.cnblogs.com/htj10/p/12357901.html
Copyright © 2020-2023  润新知