设计模式-Template_Method模式

模版方法模式属于行为型模式。模版方法模式的意图是在一个方法里实现一个算法,并推迟定义算法中的某些步骤,从而让其他类重新定义他们。

一个例子

在项目中经常会用到RedisTemplate,restTemplate,JdbcTemplate之类的对象。因为在操作资源的时候,通常会涉及到打开连接,使用资源,关闭连接的过程。但是这几个步骤又是很通用的,所以开发者抽象出来一个模版来定义一个算法骨架,然后通过子类的方式来定义各种资源具体的操作。
image

抽象模版类

/**
 * 数据源操作模版
 *  @author: xujian
 *  @Date: 2019-09-26
 *  @Description:
 */
public abstract class AbstractDataSourceTemplate {
    /**
     * 开启连接
     */
    abstract void open();

    /**
     * 执行操作
     */
    abstract void execute();

    /**
     * 关闭连接
     */
    abstract void close();

    /**
     * 模版方法
     */
    public final void run() {
        open();
        execute();
        close();
    }
}

Redis操作实现类

public class RedisDataSourceTemplate extends AbstractDataSourceTemplate {
    /**
     * 开启连接
     */
    @Override
    void open() {
        System.out.println("开启redis连接...");
    }

    /**
     * 执行操作
     */
    @Override
    void execute() {
        System.out.println("操作redis...");
    }

    /**
     * 关闭连接
     */
    @Override
    void close() {
        System.out.println("关闭redis连接...");
    }
}

Jdbc操作实现类

public class JdbcDataSourceTemplate extends AbstractDataSourceTemplate {
    /**
     * 开启连接
     */
    @Override
    void open() {
        System.out.println("开启jdbc连接...");
    }

    /**
     * 执行操作
     */
    @Override
    void execute() {
        System.out.println("操作jdbc...");
    }

    /**
     * 关闭连接
     */
    @Override
    void close() {
        System.out.println("关闭jdbc连接...");
    }
}

使用

        //jdbc模版
        AbstractDataSourceTemplate template = new JdbcDataSourceTemplate();
        template.run();
        System.out.println("----------------");
        //redis模版
        AbstractDataSourceTemplate template1 = new RedisDataSourceTemplate();
        template1.run();
开启jdbc连接...
操作jdbc...
关闭jdbc连接...
----------------
开启redis连接...
操作redis...
关闭redis连接...

总结

  • 封装不可变部分,扩展可变部分
  • 提取公共代码,便于维护
  • 行为由父类控制骨架/算法,子类实现
  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度

你可以在这里获取相关代码:设计模式-Template_Method模式

猜你喜欢

转载自www.cnblogs.com/xuxiaojian/p/11593560.html