抽象类和模板设计模式

本文探讨了抽象类的概念,解释了为何在父类中将无法具体实现的方法抽象化,以及为什么含有抽象方法的类不能被实例化。同时,通过模板设计模式的例子,展示了如何使用模板方法来执行固定套路的操作,比如计算代码运行时间。模板设计模式确保了子类在执行特定任务时遵循相同的流程,而细节由子类实现。
摘要由CSDN通过智能技术生成

总是以提问的形式来开始我的总结 ,为什么会出现抽象类 ?有哪些应用 ?

上一次我们已经说过了 ,继承可以增加代码的复用性 ,子类可以把父类的方法拿过来直接用 ,也可以重写父类的方法 。那么好 ,假设有一个 Animal 父类中含有一个 “叫“ 方法 ,有 n 多个动物继承了 Animal ,结果由于动物的独特性每一个子类都需要重写父类的 “叫“ 方法 。那么问题来了 ,所有的子类都重写了父类的方法 ,我何必还要在父类中实现方法呢 ?

所以我们就可以把 “叫“ 这个方法给抽象化 ,这样就不用实现方法体了 ,岂不是美滋滋 。综上 ,我们可以把那些父类中没办法给出具体实现的方法给抽象化 。只需在方法的声明中添加 abstract 关键字即可 。但是此时编译会报错 ,因为含有抽象方法的类必须是抽象类 ,所以我们也要给类加上 abstract 。当然抽象类中可以包含非抽象的方法 。那为什么又说抽象类不能被实例化呢 。你想啊 ,我实例化一个对象 ,结果你给了我一个抽象的方法 ,我怎么去执行啊 ?很明显不行的嘛 。

如果你真的理解了抽象类的设计原理 ,那么理解模板设计模式应该不成问题 。顾名思义 ,模板设计模式就是指固定的套路 。假如你有如下需求 ,计算代码的运行时间 。套路就是记录开始时间 ,运行方法 ,记录结束时间 ,最后一减得出结果 。可以像这样实现 。

public abstract class SupClass {

    public abstract void run();

    //这就是一个模板,限定为 final 防止子类重写该方法。
    public final void calculateTime(){
        long l1 = System.currentTimeMillis();
        run();
        long l2 = System.currentTimeMillis();

        long time = l2 - l1;
        System.out.println("运行时间为 " + time + " 毫秒。");
    }
}



public class Sub1Class extends SupClass{

    @Override
    public void run() {
        System.out.println("在计算 Sub1Class 的 run 方法执行时间。。。");
        long sum = 0;
        for (int i = 0; i < 1000000000; i++) {
            sum = sum + i;
        }
    }
}



public class Sub2Class extends SupClass{

    @Override
    public void run() {
        System.out.println("在计算 Sub2Class 的 run 方法执行时间。。。");
        long sum = 0;
        for (int i = 0; i < 10000000; i++) {
            sum = sum + i;
        }
    }
}


// 测试代码
public abstract class TemplateTest {

    public static void main(String[] args) {
        SupClass class1 = new Sub1Class();
        class1.calculateTime();

        SupClass class2 = new Sub2Class();
        class2.calculateTime();

    }
}

在计算 Sub1Class 的 run 方法执行时间。。。
运行时间为 350 毫秒。
在计算 Sub2Class 的 run 方法执行时间。。。
运行时间为 10 毫秒。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法框架,将一些步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 在模板方法模式中,定义一个抽象类作为算法的框架,其中包含了一个或多个抽象方法,这些抽象方法由子类来实现。除了抽象方法之外,抽象类还可以包含具体方法,这些具体方法在算法中的步骤中起到固定的作用。 使用模板方法模式可以将算法的实现细节封装在抽象类中,子类只需要关注具体的实现细节。这样做的好处是可以提高代码的复用性,减少冗余代码的编写。同时,模板方法模式还可以提供一个可扩展的框架,允许在不改变算法结构的情况下修改算法的某些步骤。 抽象类是一种不能被实例化的类,它主要用于定义一个接口,并提供一些默认的实现。在模板方法模式中,抽象类扮演着定义算法框架和部分具体实现的角色。抽象类中的抽象方法需要由子类来实现,而具体方法可以在抽象类中直接提供默认实现。 总结来说,模板方法模式通过定义一个算法框架和抽象类,将算法的具体实现细节延迟到子类中去实现。抽象类中的抽象方法由子类来实现,具体方法可以在抽象类中提供默认实现。这种设计模式提供了一种灵活的方式来定义算法的结构,同时也提高了代码的复用性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值