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

本文共 3435 字,大约阅读时间需要 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/

你可能感兴趣的文章
Objective-C实现karger算法(附完整源码)
查看>>
Objective-C实现KMP搜索算法(附完整源码)
查看>>
Objective-C实现Knapsack problem背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knight tour骑士之旅算法(附完整源码)
查看>>
Objective-C实现knight Tour骑士之旅算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现knuth morris pratt(KMP)算法(附完整源码)
查看>>
Objective-C实现knuth-morris-pratt(KMP)算法(附完整源码)
查看>>
Objective-C实现Koch snowflake科赫雪花曲线算法(附完整源码)
查看>>
Objective-C实现koch snowflake科赫雪花算法(附完整源码)
查看>>
Objective-C实现KPCA(附完整源码)
查看>>
Objective-C实现KruskalMST最小生成树的算法(附完整源码)
查看>>
Objective-C实现kruskal克鲁斯卡尔算法(附完整源码)
查看>>
Objective-C实现kth order statistick阶统计量算法(附完整源码)
查看>>
Objective-C实现lamberts ellipsoidal distance朗伯椭球距离算法(附完整源码)
查看>>
Objective-C实现largest AdjacentNumber最大相邻数算法 (附完整源码)
查看>>