博客
关于我
java设计模式--模板方法模式
阅读量:598 次
发布时间:2019-03-12

本文共 3353 字,大约阅读时间需要 11 分钟。

文章重新优化如下,满足您的要求:模板方法模式是软件编程中的行为模式,其特点是通过模板方法在子类中实现针对特定业务场景的行为扩展,同时保持顶级逻辑不变。如Java编程中的抽象类与具体子类,模板方法模式通过抽象方法定义算法骨架,具体子类实现算法细节。

模板方法模式的核心原理在于:子类可以通过实现具体的抽象方法,替换父类模板方法中的可变部分,但同时必须遵循父类模板方法设定的顶级逻辑步骤。这一模式尤为常见于需要灵活扩展算法步骤的系统中。

1. 模板方法模式的典型应用

以Java中的Collections类中的sort方法为例,提供了一种便捷的通用排序接口。其中,sort方法接收一个Comparator接口实例,负责实现自定义比较逻辑:

  • Algorithm Skeleton: 集成一个通用排序算法骨架。
  • Flexible Steps: 允许通过Comparator接口传入灵活的排序规则。

2. 代码演示

以下代码展示了模板方法模式的实现细节:

public abstract class Account {    public final double calculateInterest() {        double interestRate = doCalculateInterestRate();        String accountType = doCalculateAccountType();        double amount = calculateAmount(accountType);        return amount * interestRate;    }    protected abstract String doCalculateAccountType();    protected abstract double doCalculateInterestRate();    private double calculateAmount(String accountType) {        return xxx.00;    }}public class MoneyMarketAccount extends Account {    @Override    protected String doCalculateAccountType() {        return "Money Market";    }    @Override    protected double doCalculateInterestRate() {        return 0.045;    }}public class CDAccount extends Account {    @Override    protected String doCalculateAccountType() {        return "Certificate of Deposite";    }    @Override    protected double doCalculateInterestRate() {        return 0.06;    }}

3. 模板方法的优点

  • 代码复用性:顶级算法骨架可复用,减少重复代码。
  • 灵活性:子类可通过实现不同抽象方法,扩展算法行为。
  • 易维护性:算法变更时,只需修改抽象方法的实现部分,无需调整模板方法。

4.典型例子

在Java中, Servlet 的HttpServletHttpService类才是模板方法模式的典型应用。这些抽象类为其特定子类提供了一系列基本服务方法,如service(),子类可根据需求选择执行不同的do*X()方法。

5. 用户对象与排序示例

public class UserModel {    private String userId;    private String name;    private int age;    public UserModel(String userId, String name, int age) {        this.userId = userId;        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "UserId=" + userId + ", Name=" + name + ", Age=" + age;    }}public class Client {    public static void main(String[] args) {        List
list = new ArrayList<>(); UserModel um1 = new UserModel("u1", "user1", 23); UserModel um2 = new UserModel("u2", "user2", 22); UserModel um3 = new UserModel("u3", "user3", 21); UserModel um4 = new UserModel("u4", "user4", 24); list.add(um1); list.add(um2); list.add(um3); list.add(um4); System.out.println("排序前---------------------〉"); printList(list); Comparator c = new Comparator() { public int compare(Object obj1, Object obj2) { UserModel temp1 = (UserModel) obj1; UserModel temp2 = (UserModel) obj2; if (temp1.age > temp2.age) { return 1; } else if (temp1.age == temp2.age) { return 0; } else { return -1; } } }; Collections.sort(list, c); System.out.println("排序后---------------------〉"); printList(list); } private static void printList(List
list) { for (UserModel um : list) { System.out.println(um); } }}

6. 模板方法模式的核心特征

  • 子类实现抽象方法,扩展父类模板方法的逻辑。
  • 父类模板方法调用子类实现的抽象方法,完成任务。

7. 总结

模板方法模式通过定义模板方法和相关抽象操作,为子类提供灵活扩展的可能性。它在软件开发中具有广泛应用,如Servlet和Collects类的工具方法等。熟练掌握这一模式,大大提升代码复用性和可维护性,是Java程序员的必备技能。

转载地址:http://dsgtz.baihongyu.com/

你可能感兴趣的文章
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
MYSQL 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>