模版方法设计模式(抽象类)

总结理解的模板方法设计模式及抽象类

(菜鸟一只,若有什么侵权或者不足之处,请指出,谢谢)

模板方法设计模式:

在父类中定义一个总体的算法骨架,而将一些具体的实现步骤放在到子类中,因为不同的子类实现细节不同
         模板方法使得子类可以在不改变算法框架的情况下,只需要重新定义算法的某些实现步骤(借助于抽象类实现)

模板方法:一种统一的处理方式,即模板(比如课设报告,大家都按照规定同一种的格式去写,这就是模板,但是课设的题目不同,其具体内容是不同的)

注意:
         抽象父类提供的模板方法只是定义了一个通用的算法,其实现必须通过子类的辅助
         模板方法作为模板样式不允许被子类覆盖

例如:

class StringOperate{

    //需求:求String的连续1000次拼接的时间
    public static long stringAppend() {
        long startTime = System.currentTimeMillis();//开始时间
        String str = "";
        for(int i = 0 ; i < 1000 ; i++) {
            str += 1;
        }

        long endTime = System.currentTimeMillis();//结束时间

        long time = endTime - startTime;//时间差
        return time;
    }
}
class IntOperate{

    //需求:int类型的连续100000次加1的时间
    public static long intAppend() {
        long startTime = System.currentTimeMillis();//开始时间
        int num = 0;
        for(int i = 0 ; i < 100000 ; i++) {
            num += 1;
        }

        long endTime = System.currentTimeMillis();//结束时间

        long time = endTime - startTime;//时间差
        return time;
    }
}    

倘若有很多如上面类似的行为,则代码存在大量重复现象

可修改为:

abstract class AbstractOperateTimeLate{
    //模板方法
    public long getTotalTime() {
        long startTime = System.currentTimeMillis();//开始时间模板方法

        //具体操作(留给子类完成)
        operateTime();

        long endTime = System.currentTimeMillis();//结束时间

        long time = endTime - startTime;//操作  计算时间差
        return time;
    }

    //抽象方法  具体实现在子类重覆盖本抽象方法里面
    protected abstract void operateTime();
}
class StringOperate extends AbstractOperateTimeLate{

    //计算String拼接1000次的时间 (在其他子类中也可以通过覆盖抽象类中的抽象方法来实现其他操作的时间差)抽象类的具体实现
    @Override
    protected void operateTime() {
        String str = "";
        for(int i = 0 ; i < 1000 ; i++) {
            str += 1;
        }
    }
}

public class TestDemo01 {
    public static void main(String[] args) {
        long time = new StringOperate().getTotalTime();//调用父类中的模板方法
        System.out.println(time);
    }
}
            

抽象类的概念

   在继承的层次结构中,每个子类的行为(功能实现)会越来明确,如果追溯到父类,类会变得更通用,更加不明确。类的设计应该确保父类包含它的子类的共同特性。有时候,一个父类设计的非常抽象,以至于没有任何具体的实例,这样的类称为抽象类

  Java中允许在类中只声明方法而不提供方法的实现。这种只有声明而没有方法体的方法成为抽象方法,而包含一个或者多个抽象方法的类称为抽象类。
抽象方法是通过指定abstract关键字来创建。抽象方法没有内容,因此不需要被父类执行。

  抽象类是为了把子类中具有共同特性但是实现细节不同的东西提取出来,达到代码复用的目的。抽象方法的具体实现在子类中(注意:如果定义了一个抽象类,当子类继承一个抽象类时,子类要重写父类中的所有抽象方法,否则需要将子类也声明为abstract抽象类。)

抽象类需要注意几点:

(1)一个抽象类只关心是否具有某种功能,而不关心功能的具体实现,功能的具体行为和属性由子类负责实现,所以抽象类不能被实例化。因为抽象类中方法未具体化,这是一种"不完整"的类,直接实例化也就没有意义。

(2)抽象类中不一定要包含抽象(abstract)方法。抽象类中可以没有抽象方法。但是一旦类中包含了抽象方法,那类该类必须声明为抽象类。

(3)抽象类中不一定只有抽象方法,可以有普通方法。抽象类通过子类来调用和实现抽象方法和普通方法。

坚持学习 永远年轻 永远热泪盈眶

参考:梁勇.Java语言程序设计.机械工业出版社

原文地址:https://www.cnblogs.com/jiang0123/p/11186452.html

时间: 2024-10-12 02:43:49

模版方法设计模式(抽象类)的相关文章

二、模版方法设计模式

模板方法设计模式: 解决的问题:当功能内部一部分实现是确定,一部分实现是不确定的.这时可以把不确定的部分暴露出去,让子类去实现. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 abstract class GetTime{     public final void getTime(){ //此功能如果不需要复写,可加final限定         long start

代码片--实现一个简单的模版方法设计模式(获取一段程序运行的时间)

package com.dreamy.day03; /** * @author dreamy * 需求:获取一段程序运行的时间 * 原理:获取程序开始和结束的时间并相减即可. * 获取时间:System.currentTimeMillis() * * * 当代码完成优化后,就可以解决这类问题 * 这种方式叫做模版方法设计模式. * * 什么是模版方法呢? * 在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用的不确定的部分, * 那么这时就将不确定的部分暴露出去,由该

模版方法设计模式

什么是模板方法 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 重复代码全部在父类里面,不同业务的,抽取给子类进行实现.抽取过程---抽象方法. 某些特定步骤. 核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,将这个节点的代码实现转移给 子类完成.即:处理步骤在父类中定义好,具体的实现延迟到子类中定义. 说白了,就是将一些相同操作的代码,封装成一个算法的骨架.核心的部

007 - 策略模式对模版方法设计模式改进

如果我只需要获取User 的name 怎么办? 需要在重新创建一个方法 单独获取方法吗? 那可以通过返回User 对象 这种方法 虽然说可以, 但不怎么符合设计规范 我需要什么样的数据, 你应该就返回给我什么数据, 而不是需要我在处理而且当数据量的时候 会影响网络数据的传输性能 public String findName(int id){     String sql = "select name from user where id = ?";     Object[] args 

设计模式-模版方法模式

模版方法是一个非常简单,使用频率比较高的设计模式. 意图: 定义一个操作中算法的骨架,而将将一些方法的实现延迟到子类中,TemplateMethod使得子类可以不改变算法的结构即可重定义算法的特定方法. 参与者: AbstractClass,抽象类.定义抽象的操作,具体的子类将重新定义各自的实现算法. ConcreteClass,具体的实现类. 回想一下,在之前的开发中用到过这种模式,简单描述一下场景. 在轻松天气项目中,主程序生成widget,由于widget插件不断的扩充和升级,具体的布局和

设计模式 -- 模版方法模式

模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive method):而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来. 举个例子: 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃

Java设计模式の模版方法模式

概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 比如定义一个操作中的算法的骨架,将步骤延迟到子类中.模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 具体类(ConcreteClass):实

设计模式 模版方法模式 展现程序员的一天

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现.定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座).简单描述一下:本公司有程序猿.测试

NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Template Method模式 4.适用性及实现要点 概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识. 意图 定义一个操作中的算法的骨架,而将一些