设计模式[14]-模版方法模式-Template Method Pattern

1.模版方法模式简介

模版方法模式(Template Method Pattern)是行为型(Behavioral)设计模式,使用了Java的继承机制,在抽象类里定义了模版方法,该模版方法调用了若干抽象方法(子类实现)或具体方法(子类可覆盖);并迫使子类实现抽象方法,从而实现其余的逻辑。

模版方法的用意在于,把相同的部分放在抽象基类中实现,把变化的部分延迟到子类中实现,不同的子类可以以不同的方式实现抽象方法,达到代码复用的目的。

模版方法模式一共有两种角色:

  • AbstractClass(抽象类): 抽象类里定义了模版方法,模版方法定义了算法的框架(步骤),包括一系列基本操作;这些基本操作可以是抽象的(由子类实现),也可以是具体的。

  • ConcreteClass(具体子类): 是抽象类的子类,用于实现在父类中声明的抽象基本操作,也可以覆盖父类中已经实现的具体基本操作。

2. 模版方法模式举例

当使用JDBC操作数据库的时候,通常会有以下步骤:

  1. 加载驱动
  2. 打开连接
  3. 创建Statement
  4. 执行SQL
  5. 关闭Statement和连接

每次对数据做操作相同的部分都有加载驱动、打开连接、创建Statement、关闭Statement和连接,差别的部分仅在执行SQL部分,因此非常适用于使用模版方法模式。下面我们就根据这个场景,模拟举例。

序号 类名 角色 说明
1 AbstractTemplate AbstractClass 定义了模版方法的抽象类
2 ConcreteTemplate ConcreteClass 具体子类,实现了父类的抽象方法
3 TemplateMain 客户端 演示调用

AbstractTemplate类中的execute()就是模版方法,它定义了一个算法框架,包括了openConnection、doQuery、closeConnection等基本操作,其中doQuery是抽象的。ConcreteTemplate继承自AbstractTemplate,实现了doQuery方法。

设计模式[14]-模版方法模式-Template Method Pattern_第1张图片
Paste_Image.png

1. 抽象模版类。

/**
 * 抽象模版类
 */
public abstract class AbstractTemplate {

    private void openConnection(){
        System.out.println("打开连接");
    }

    // 模版方法
    public final void execute(){
        openConnection();
        doQuery();
        closeConnection();
    }

    // 抽象方法
    protected abstract void doQuery();

    private void closeConnection(){
        System.out.println("关闭连接");
    }
}

2.具体模版类

/**
 * 具体模版类
 */
public class ConcreteTemplate extends AbstractTemplate {

    protected void doQuery() {
        System.out.println("执行查询");
    }
}

3.演示调用

public class TemplateMain {

    public static void main(String[] args) {
        AbstractTemplate template = new ConcreteTemplate();
        template.execute();
    }
}

结果输出:

打开连接
执行查询
关闭连接

3. 总结

模版方法模式是一种通过类继承的方式、实现代码复用的技术,把公共行为放在父类中,而通过不同的子类来实现不同的行为。

除了JDBC操作数据,在JMS或者MQ的操作时,同样也可以用到模版方法。此外,Servlet中也有模版方法的影子,我们在写Servlet的时候,通常都会继承自HttpServlet,只需要覆盖其doGet()和doPost()即可;Servlet公共的行为都已经在HttpServlet中实现了。

(完)

你可能感兴趣的:(设计模式[14]-模版方法模式-Template Method Pattern)