您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么使用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() {}
}
抽象类(AbstractClass):
具体类(ConcreteClass):
AbstractList
、HttpServlet
JdbcTemplate
// 抽象类
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("加柠檬");
}
}
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) {
// 关闭资源实现...
}
}
钩子方法(Hook Method)是模板方法模式的扩展点,它: - 在抽象类中提供默认空实现 - 子类可选择覆盖或不覆盖 - 用于控制模板方法中的可选流程
protected boolean shouldLog() {
return false; // 默认不记录日志
}
当需要更灵活地替换算法时,可以结合策略模式:
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeTemplate() {
step1();
strategy.execute();
step3();
}
}
在Java 8中可以使用Lambda表达式简化实现:
public void process(Consumer<Data> handler) {
init();
handler.accept(data);
cleanup();
}
模板方法与策略模式的区别?
为什么模板方法要声明为final?
何时使用钩子方法?
模板方法模式通过将不变行为搬移到父类,去除子类中的重复代码,是代码复用的基本技术。它在框架设计中尤其重要,定义了框架的骨架,允许用户自定义特定步骤的实现。
模板方法模式体现了”好莱坞原则”,是面向对象设计中控制反转的典型实现,合理使用可以大大提高代码的可维护性和扩展性。
本文共计约2400字,详细介绍了Java模板方法模式的核心概念、实现方式、使用场景以及高级应用技巧。通过具体代码示例和对比分析,帮助开发者深入理解并正确应用该设计模式。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。