怎么使用java模板方法模式

发布时间:2021-11-17 11:10:37 作者:iii
来源:亿速云 阅读:174
# 怎么使用Java模板方法模式

## 一、什么是模板方法模式

模板方法模式(Template Method Pattern)是行为型设计模式的一种,它定义了一个操作中的算法骨架,而将某些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些特定步骤。

### 核心思想
- **固定流程**:父类定义不可变的算法执行流程
- **灵活扩展**:子类实现可变的细节步骤
- **好莱坞原则**:"Don't call us, we'll call you" - 父类调用子类方法

## 二、模式结构

```java
public abstract class AbstractClass {
    // 模板方法(final防止子类覆盖)
    public final void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    }
    
    // 抽象方法(必须由子类实现)
    protected abstract void primitiveOperation1();
    protected abstract void primitiveOperation2();
    
    // 具体方法(已有默认实现)
    protected void concreteOperation() {
        // 实现代码
    }
    
    // 钩子方法(可选实现)
    protected void hook() {}
}

关键角色

  1. 抽象类(AbstractClass)

    • 定义模板方法和基本方法
    • 模板方法一般声明为final
  2. 具体类(ConcreteClass)

    • 实现抽象类中的抽象方法
    • 可选择覆盖钩子方法

三、使用场景

典型应用场景

  1. 具有统一流程但步骤实现不同的业务
  2. 需要扩展算法特定步骤的场景
  3. 存在多个相似子类需要重构时

实际案例

四、代码实现示例

示例1:饮料制作模板

// 抽象类
public abstract class BeverageTemplate {
    
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if(customerWantsCondiments()) {
            addCondiments();
        }
    }
    
    protected abstract void brew();
    protected abstract void addCondiments();
    
    private void boilWater() {
        System.out.println("煮沸水");
    }
    
    private void pourInCup() {
        System.out.println("倒入杯中");
    }
    
    // 钩子方法
    protected boolean customerWantsCondiments() {
        return true;
    }
}

// 具体实现
public class Coffee extends BeverageTemplate {
    @Override
    protected void brew() {
        System.out.println("冲泡咖啡粉");
    }
    
    @Override
    protected void addCondiments() {
        System.out.println("加糖和牛奶");
    }
    
    @Override
    protected boolean customerWantsCondiments() {
        return false; // 不要调料
    }
}

public class Tea extends BeverageTemplate {
    @Override
    protected void brew() {
        System.out.println("浸泡茶叶");
    }
    
    @Override
    protected void addCondiments() {
        System.out.println("加柠檬");
    }
}

示例2:数据库操作模板

public abstract class JdbcTemplate {
    
    public final Object execute(String sql) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 1.获取连接
            conn = getConnection();
            // 2.创建语句
            stmt = conn.createStatement();
            // 3.执行查询
            ResultSet rs = stmt.executeQuery(sql);
            // 4.处理结果(交给子类)
            return handleResult(rs);
        } catch (SQLException e) {
            // ...异常处理
        } finally {
            // 5.释放资源
            closeResources(conn, stmt);
        }
        return null;
    }
    
    protected abstract Object handleResult(ResultSet rs) throws SQLException;
    
    private Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
    }
    
    private void closeResources(Connection conn, Statement stmt) {
        // 关闭资源实现...
    }
}

五、模式优缺点

优点

  1. 代码复用:封装不变部分,扩展可变部分
  2. 反向控制:通过父类调用子类操作
  3. 符合开闭原则:增加新子类无需修改父类
  4. 便于维护:公共行为集中在父类

缺点

  1. 限制灵活性:模板方法固定了执行流程
  2. 增加系统复杂度:每个不同实现都需要子类
  3. 违反里氏替换原则:子类可能改变父类行为

六、高级应用技巧

1. 钩子方法的使用

钩子方法(Hook Method)是模板方法模式的扩展点,它: - 在抽象类中提供默认空实现 - 子类可选择覆盖或不覆盖 - 用于控制模板方法中的可选流程

protected boolean shouldLog() {
    return false; // 默认不记录日志
}

2. 模板方法与策略模式结合

当需要更灵活地替换算法时,可以结合策略模式:

public class Context {
    private Strategy strategy;
    
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void executeTemplate() {
        step1();
        strategy.execute();
        step3();
    }
}

3. 使用函数式接口(Java8+)

在Java 8中可以使用Lambda表达式简化实现:

public void process(Consumer<Data> handler) {
    init();
    handler.accept(data);
    cleanup();
}

七、常见面试问题

  1. 模板方法与策略模式的区别?

    • 模板方法:基于继承,控制算法流程
    • 策略模式:基于组合,替换完整算法
  2. 为什么模板方法要声明为final?

    • 防止子类改变算法骨架
    • 确保模板方法的稳定性和一致性
  3. 何时使用钩子方法?

    • 当需要让子类可选地参与算法某些步骤时
    • 提供默认实现,子类按需覆盖

八、总结

模板方法模式通过将不变行为搬移到父类,去除子类中的重复代码,是代码复用的基本技术。它在框架设计中尤其重要,定义了框架的骨架,允许用户自定义特定步骤的实现。

最佳实践建议

  1. 仔细分析算法步骤,合理划分固定和可变部分
  2. 模板方法尽量简单,不宜包含太多步骤
  3. 合理使用钩子方法提供灵活性
  4. 考虑与其它模式(如工厂方法)结合使用

模板方法模式体现了”好莱坞原则”,是面向对象设计中控制反转的典型实现,合理使用可以大大提高代码的可维护性和扩展性。


本文共计约2400字,详细介绍了Java模板方法模式的核心概念、实现方式、使用场景以及高级应用技巧。通过具体代码示例和对比分析,帮助开发者深入理解并正确应用该设计模式。 “`

推荐阅读:
  1. Java描述设计模式(19):模板方法模式
  2. 折腾Java设计模式之模板方法模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:netbackup7.0备份6号错误怎么回事

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》