模板方法设计模式(TemplateMethod)

2023-04-18 10:50:53 浏览数 (1)

抽象类

 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

语法

抽象类: 被abstract修饰的类。 抽象方法: 被abstract修饰没有方法体的方法。

抽象类的语法格式:

代码语言:javascript复制
[权限修饰符] abstract class 类名{
}

[权限修饰符] abstract class 类名 extends 父类{    
}

//抽象方法的语法格式
[其他修饰符] abstract 返回值类型 方法名([形参列表]);
//注意:抽象方法没有方法体

使用说明

  • 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。 理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
  • 抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
  • 抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。 理解:子类的构造方法中,有默认的super()或手动的super(实参列表),需要访问父类构造方法。
  • 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
  • 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。 理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

注意事项

  • 不能用abstract修饰变量、代码块、构造器;
  • 不能用abstract修饰私有方法、静态方法、final的方法、final的类。

模板方法设计模式

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

解决的问题:

  • 当功能内部一部分实现是确定的,另一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
  • 例如:在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。

代码示例

示例1:

代码语言:javascript复制
//模板方法
public abstract class Template {
    public final void getTime(){
        long start = System.currentTimeMillis();
        this.code();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"   (end - start));
    }

    public abstract void code();
}
//具体实现
public class SubTemplate extends Template {
    //求2-100000之间的质数
    @Override
    public void code() {
        int count = 0;
        label:
        for (int i = 2; i <= 100000; i  ) {
            for (int j = 2; j <= Math.sqrt(i); j  ) {
                if (i % j == 0) {
                    //结束【当前】最外层循环
                    continue label;
                }
            }
            count  ;
        }
        System.out.println("质数有:"   count);
    }
}

public static void main(String[] args) {
    Template subTemplate = new SubTemplate();
    subTemplate.getTime();
}

示例2:

代码语言:javascript复制
//模板方法
abstract class BankTemplateMethod {
    // 具体方法
    public void takeNumber() {
        System.out.println("取号排队");
    }

    public abstract void transact(); // 办理具体的业务 //钩子方法

    public void evaluate() {
        System.out.println("反馈评分");
    }

    // 模板方法,把基本操作组合到一起,子类一般不能重写
    public final void process() {
        this.takeNumber();

        this.transact();// 像个钩子,具体执行时,挂哪个子类,就执行哪个子类的实现代码

        this.evaluate();
    }
}

class DrawMoney extends BankTemplateMethod {
    public void transact() {
        System.out.println("我要取款!!!");
    }
}

class ManageMoney extends BankTemplateMethod {
    public void transact() {
        System.out.println("我要理财!我这里有2000万美元!!");
    }
}

//抽象类的应用:模板方法的设计模式
public class TemplateMethodTest {
    public static void main(String[] args) {
        BankTemplateMethod btm = new DrawMoney();
        btm.process();

        BankTemplateMethod btm2 = new ManageMoney();
        btm2.process();
    }
}

应用

模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,

常见的有:

  • 数据库访问的封装
  • Junit单元测试
  • JavaWeb的Servlet中关于doGet/doPost方法调用
  • Hibernate中模板程序
  • Spring中JDBCTemlate、HibernateTemplate等

0 人点赞