1 基本介绍
定义如下:定义一个操作中算法的框架,而将一些步骤延迟到子类中。
模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。
2 代码框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| abstract class AbstractClass { public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); PrimitiveOperation3(); } public void PrimitiveOperation1() { } public abstract void PrimitiveOperation2(); public virtual void PrimitiveOperation3() {} }
class ConcreteClass extends AbstractClass { public override void PrimitiveOperation2() { } public override void PrimitiveOperation3() { } }
|
3 设计分析
开发一个利息计算模块
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package DesignPatterns.JavaDesign.Template;
import java.io.Console;
public class Test { public static void main(String[] args) { Account account; account = new CurrentAccount(); account.Handle("张无忌", "123456"); } }
abstract class Account { public Boolean Validate(String account, String password) { System.out.println("账号:" + account); System.out.println("密码:" + password); if (account.equals("张无忌") && password.equals("123456")) { return true; } else { return false; } } public abstract void CalculateInterest(); public void Display() { System.out.println("显示利息!"); } public void Handle(String account, String password) { if (!Validate(account,password)) { System.out.println("账户或密码错误!"); return; } CalculateInterest(); Display(); } }
class CurrentAccount extends Account { public void CalculateInterest() { System.out.println("按活期利率计算利息!"); } }
class SavingAccount extends Account { public void CalculateInterest() { System.out.println("按定期利率计算利息!"); } }
|
4 总结
优缺点分析
优点:
- 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
- 代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为
- 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行
- 在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则
缺点:
- 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象
适用场景
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现的场景
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制e