0
点赞
收藏
分享

微信扫一扫

抽象类实践--模板设计模式

1. 基本介绍

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

2. 模板设计模式能解决的问题

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

2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式.

3. 最佳实践

需求

1)有多个类,完成不同的任务job

2) 要求统计得到各自完成任务的时间

3)请编程实现TestTemplate.java

抽象类实践--模板设计模式_模板设计模式

设计一个抽象类(Template),能完成如下功能:

1.编写方法calculateTime(),可以计算某代码的耗时时间

2.编写抽象类job()

3.编写一个子类Sub,继承抽象Template,并实现job方法

4.编写一个测试类TestTemplate,看看是否好用

3.1 普通方法  401

代码在com.stulzl.abstract_templatecommon.包中

测试TemplateCommon

package com.stulzl.abstract_testtemplate;

//抽象类实践--模板设计模式401
public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calculateTime();
        BB bb = new BB();
        bb.calculateTime();
    }
}

AA类

package com.stulzl.abstract_templatecommon;

public class AA {

    //通过观察job()和job()2有很多相同部分,代码冗余严重,
    //所以编写calculateTime()方法,将共同部分代码写进来,然后调用任务job()方法,从而节省代码量
    public void calculateTime(){
        long start = System.currentTimeMillis();//获取当前时间(开始时间)
        job();
        long end = System.currentTimeMillis();//获取当前时间(结束时间)
        System.out.println("AA执行时间 "+(end-start));
    }

    //计算任务
    //1+....+ 800000
    public void job(){
        long num = 0;
       // long start = System.currentTimeMillis();//获取当前时间(开始时间)
        for (long i = 1; i <=800000; i++) {
            num+=i;
        }
//        long end = System.currentTimeMillis();//获取当前时间(结束时间)
//        System.out.println("AA执行时间 "+(end-start));
    }

//    public void job2(){
//        long num = 0;
//        long start = System.currentTimeMillis();//获取当前时间(开始时间)
//        for (long i = 1; i <=100000; i++) {
//            num+=i;
//        }
//        long end = System.currentTimeMillis();//获取当前时间(结束时间)
//        System.out.println("AA执行时间 "+(end-start));
//    }
}

BB类

package com.stulzl.abstract_templatecommon;

public class BB {
    //与AA类中的calculateTime()方法原因一样
    public void calculateTime(){
        long start = System.currentTimeMillis();//获取当前时间(开始时间)
        job();
        long end = System.currentTimeMillis();//获取当前时间(结束时间)
        System.out.println("BB执行时间 "+(end-start));
    }
    public void job(){
        long num = 1;
//        long start = System.currentTimeMillis();//获取当前时间(开始时间)
        for (long i = 1; i <=800000; i++) {
            num*=i;
        }
//        long end = System.currentTimeMillis();//获取当前时间(结束时间)
//        System.out.println("BB执行时间 "+(end-start));
    }
}

3.2 分析问题,提出使用模板设计模式  401

代码在com.stulzl.abstract_template.包中

测试Test

package com.stulzl.abstract_template;

//抽象类—模板设计模式401
public class Test {
    public static void main(String[] args) {
        CC aa = new CC();
        aa.calculateTime();//涉及多态动态绑定机制
        DD bb = new DD();
        bb.calculateTime();
    }
}

父类Template 

package com.stulzl.abstract_template;

abstract public class Template {//抽象类—模板设计模式  父类

    public abstract void job();//抽象方法

    public void calculateTime(){//实现方法,调用job方法
        long start = System.currentTimeMillis();//获取当前时间(开始时间)
        job();//涉及多态动态绑定机制
        long end = System.currentTimeMillis();//获取当前时间(结束时间)
        System.out.println("任务执行时间 "+(end-start));
    }
}

子类CC

package com.stulzl.abstract_template;

public class CC extends Template{//子类

    //计算任务
    //1+....+ 800000
    public void job(){//实现父类抽象方法重写
        long num = 0;
        for (long i = 1; i <=800000; i++) {
            num+=i;
        }
    }
}

子类DD

package com.stulzl.abstract_template;

public class DD extends Template{//子类

    public void job(){//实现父类抽象方法重写
        long num = 1;
        for (long i = 1; i <=800000; i++) {
            num*=i;
        }
    }
}


举报

相关推荐

0 条评论