当前位置: 首页 > wzjs >正文

南昌优化网站分析京津冀协同发展

南昌优化网站分析,京津冀协同发展,做淘客网站的公司,网站网站建设公司模板方法模式详解 一、模式定义 模板方法模式(Template Method Pattern)定义一个操作中的算法骨架,将某些步骤延迟到子类实现。 二、核心结构 1. 抽象模板类 public abstract class AbstractTemplate {// 模板方法(final防止子类覆盖)pu…

模板方法模式详解

一、模式定义

模板方法模式(Template Method Pattern)定义一个操作中的算法骨架,将某些步骤延迟到子类实现。

二、核心结构

1. 抽象模板类

public abstract class AbstractTemplate {// 模板方法(final防止子类覆盖)public final void templateMethod() {step1();step2();step3();if(hook()) {step4();}}// 抽象方法(必须由子类实现)protected abstract void step2();// 具体方法(已有默认实现)protected void step1() {System.out.println("执行步骤1");}protected void step3() {System.out.println("执行步骤3");}// 钩子方法(可选覆盖)protected boolean hook() {return true;}protected void step4() {System.out.println("执行步骤4");}
}

2. 具体实现类

public class ConcreteClassA extends AbstractTemplate {protected void step2() {System.out.println("A实现-步骤2");}protected boolean hook() {return false; // 关闭步骤4}
}public class ConcreteClassB extends AbstractTemplate {protected void step2() {System.out.println("B实现-步骤2");}protected void step4() {System.out.println("B定制-步骤4");}
}

三、完整示例:饮料制作系统

1. 抽象饮料类

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

2. 具体饮料实现

// 咖啡
public class Coffee extends BeverageTemplate {protected void brew() {System.out.println("冲泡咖啡粉");}protected void addCondiments() {System.out.println("加糖和牛奶");}protected boolean customerWantsCondiments() {String answer = getUserInput();return answer.toLowerCase().startsWith("y");}private String getUserInput() {System.out.print("要加糖和牛奶吗(y/n)? ");BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));try {return reader.readLine();} catch (IOException e) {return "no";}}
}// 茶
public class Tea extends BeverageTemplate {protected void brew() {System.out.println("浸泡茶叶");}protected void addCondiments() {System.out.println("加柠檬");}
}

3. 客户端使用

public class BeverageTest {public static void main(String[] args) {System.out.println("制作咖啡...");BeverageTemplate coffee = new Coffee();coffee.prepareBeverage();System.out.println("\n制作茶...");BeverageTemplate tea = new Tea();tea.prepareBeverage();}
}

四、高级应用:数据库操作模板

1. 抽象DAO模板

public abstract class JdbcTemplate {// 模板方法public final <T> T execute(String sql, RowMapper<T> rowMapper) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {conn = getConnection();stmt = conn.prepareStatement(sql);setParameters(stmt);rs = stmt.executeQuery();return rowMapper.mapRow(rs);} catch (SQLException e) {throw new RuntimeException(e);} finally {closeResources(conn, stmt, rs);}}protected abstract void setParameters(PreparedStatement stmt) throws SQLException;protected Connection getConnection() throws SQLException {return DriverManager.getConnection("jdbc:mysql://localhost:3306/test");}protected void closeResources(Connection conn, Statement stmt, ResultSet rs) {try { if (rs != null) rs.close(); } catch (SQLException e) {}try { if (stmt != null) stmt.close(); } catch (SQLException e) {}try { if (conn != null) conn.close(); } catch (SQLException e) {}}
}

2. 行映射接口

public interface RowMapper<T> {T mapRow(ResultSet rs) throws SQLException;
}

3. 具体DAO实现

public class UserDao extends JdbcTemplate {public User findById(long id) {return execute("SELECT * FROM users WHERE id = ?", rs -> {User user = new User();user.setId(rs.getLong("id"));user.setName(rs.getString("name"));return user;});}protected void setParameters(PreparedStatement stmt) throws SQLException {stmt.setLong(1, 1L); // 设置查询参数}
}

五、模式优势

  1. 提高代码复用性
  2. 实现反向控制(好莱坞原则)
  3. 便于扩展和维护
  4. 符合开闭原则

六、适用场景

  1. 多个类有相同算法结构
  2. 需要控制子类扩展点
  3. 存在公共行为需要抽取
  4. 框架设计中的流程控制

七、注意事项

  1. 模板方法应该声明为final
  2. 合理设计抽象方法和钩子方法
  3. 避免过度抽象导致复杂度增加
  4. 与策略模式区分使用场景

八、最佳实践

  1. 使用钩子方法提供灵活扩展点
  2. 保持模板方法简洁
  3. 合理命名抽象方法
  4. 考虑与工厂方法模式结合使用
  5. 为常用操作提供默认实现

九、完整示例代码结构

src/
├── main/
│ ├── java/
│ │ ├── template/
│ │ │ ├── AbstractTemplate.java
│ │ │ ├── ConcreteClassA.java
│ │ │ ├── ConcreteClassB.java
│ │ │ ├── BeverageTemplate.java
│ │ │ ├── Coffee.java
│ │ │ ├── Tea.java
│ │ │ ├── JdbcTemplate.java
│ │ │ ├── UserDao.java
│ │ │ └── BeverageTest.java
http://www.dtcms.com/wzjs/83480.html

相关文章:

  • 沈阳酒店企业网站制作公司广州代运营公司有哪些
  • 怎么做可以直播的网站网站怎么制作
  • 最简约的网站软文案例
  • 建设银行天津分行门户网站百度指数官网登录
  • 玉树市wap网站建设公司2023百度秒收录技术
  • 前端代码 分享网站凡科网怎么建网站
  • 网站推广建设策略网络营销的方式有哪些
  • 新网主机不能指向其他网站软文推广平台有哪些
  • 一个网站需要多长时间杭州搜索引擎优化公司
  • 网站建设请示报告免费优化推广网站的软件
  • 成功的个人网站朝阳seo排名
  • 南宁快速建站模板百度广告位价格表
  • 高端品销售网站南宁seo推广外包
  • 烟台建设局网站seo伪原创工具
  • 网站建设开发综合实训小结最新的全国疫情
  • 网站建设公司哪家最好搜索推广广告
  • 坪山网站建设信息会员制营销
  • 个人网站页脚设计2023年8月疫情恢复
  • 做公司网站的流程南昌seo优化公司
  • 系统网站建设公司文娱热搜榜
  • 接入商 济南网站建设google竞价推广
  • 佛山专业网站建设的公司手机如何制作网页链接
  • 做娱乐网站彩票代理seo关键词排名优化矩阵系统
  • 网页设计网站作业百度搜索排名规则
  • HTML5移动端手机网站开发适合seo的建站系统
  • 做网站需要多少台服务器福州网站快速排名提升
  • 微信网站制作设计方案常德政府网站
  • 广州网站建设制作宁波网络优化seo
  • 一句吸引人的广告语太原seo网站管理
  • 长春免费建网站搜索引擎推广的方法有哪些