一、类图
二、模式含义
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1、 AbstractClass(抽象类):
a.在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,
b.每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。
c.同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,
d.模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
2、ConcreteClass(具体子类):
a.它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,
b.也可以覆盖在父类中已经实现的具体基本操作。
三、代码实现
1、抽象类
package com.yan.pattern.template;
public abstract class Account {
protected double balance;
protected double interest;
public void handle(String account, String password) {
if(!valid(account, password)) {
System.out.println("用户名或者密码不正确");
return;
}
display(account, password);
calculateInterest(account, password);
}
private boolean valid(String account, String password) {
if("zhangsan".equals(account) && "123456".equals(password)) {
return true;
}
return false;
}
public void display(String account, String password) {
System.out.println("--------------------------------");
System.out.println("显示账号");
}
public abstract void calculateInterest(String account, String password);
}
2、具体子类
package com.yan.pattern.template;
public class CurrentAccount extends Account{
@Override
public void calculateInterest(String account, String password) {
balance = 2000;
interest = 0.1;
System.out.println("活动账户余额:" + balance);
System.out.println("活动账户利息:" + interest);
}
}
package com.yan.pattern.template;
public class SavingAcount extends Account{
@Override
public void calculateInterest(String account, String password) {
balance = 1000;
interest = 0.15;
System.out.println("储蓄账户余额:" + balance);
System.out.println("储蓄账户利息:" + interest);
}
}
3、测试类
package com.yan.pattern.template;
public class TemplateMethodTest {
public static void main(String[] args) {
Account account = new CurrentAccount();
account.handle("zhangsan", "123456");
Account account2 = new SavingAcount();
account2.handle("zhangsan", "123456");
}
}
四、总结
在以下情况下可以考虑使用模板方法模式:
(1) 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即:一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
(2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3) 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。