《JAVA与模式》第17天―模板方法模式 (二)

2014-11-24 08:26:59 · 作者: · 浏览: 6
现,因为通常一个具体类并不需要所有的方法。
  命名规则
  命名规则是设计师之间赖以沟通的管道之一,使用恰当的命名规则可以帮助不同设计师之间的沟通。
  钩子方法的名字应当以do开始,这是熟悉设计模式的Java开发人员的标准做法。在上面的例子中,钩子方法hookMethod()应当以do开头;在HttpServlet类中,也遵从这一命名规则,如doGet()、doPost()等方法。

________________________________________

使用场景
  考虑一个计算存款利息的例子。假设系统需要支持两种存款账号,即货币市场(Money Market)账号和定期存款(Certificate of Deposite)账号。这两种账号的存款利息是不同的,因此,在计算一个存户的存款利息额时,必须区分两种不同的账号类型。
  这个系统的总行为应当是计算出利息,这也就决定了作为一个模板方法模式的顶级逻辑应当是利息计算。由于利息计算涉及到两个步骤:一个基本方法给出账号种类,另一个基本方法给出利息百分比。这两个基本方法构成具体逻辑,因为账号的类型不同,所以具体逻辑会有所不同。
  显然,系统需要一个抽象角色给出顶级行为的实现,而将两个作为细节步骤的基本方法留给具体子类实现。由于需要考虑的账号有两种:一是货币市场账号,二是定期存款账号。系统的类结构如下图所示。

  源代码
  抽象模板角色类
[java]
1. package com.bankht.Template;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-28 上午11:13:22
6. *
7. * @类说明 :抽象模板角色类
8. */
9. public abstract class Account {
10. /**
11. * 模板方法,计算利息数额
12. *
13. * @return 返回利息数额
14. */
15. public final String calculateInterest() {
16. double interestRate = doCalculateInterestRate();
17. String accountType = doCalculateAccountType();
18. System.out.println(accountType);
19. double amount = calculateAmount(accountType);
20. return amount + "*" + interestRate+ "=" + (amount * interestRate);
21. }
22.
23. /**
24. * 基本方法留给子类实现
25. */
26. protected abstract String doCalculateAccountType();
27.
28. /**
29. * 基本方法留给子类实现
30. */
31. protected abstract double doCalculateInterestRate();
32.
33. /**
34. * 基本方法,已经实现
35. */
36. private double calculateAmount(String accountType) {
37. /**
38. * 省略相关的业务逻辑
39. */
40. return 7243.00;
41. }
42. }


  具体模板角色类
[java]
1. package com.bankht.Template;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-28 上午11:14:13
6. *
7. * @类说明 :具体模板角色类- 定期账号
8. */
9. public class CDAccount extends Account {
10.
11. @Override
12. protected String doCalculateAccountType() {
13. return "CDA";
14. }
15.
16. @Override
17. protected double doCalculateInterestRate() {
18. return 0.06;
19. }
20.
21. }


[java]
1. package com.bankht.Template;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-28 上午11:13:49
6. *
7. * @类说明 :具体模板角色类- 货币市场账号
8. */
9. public class MoneyMarketAccount extends Account {
10.
11. @Override
12. protected String doCalculateAccountType() {
13.
14. return "MMA";
15. }
16.
17. @Override
18. protected double doCalculateInterestRate() {
19.
20. return 0.045;
21. }
22.
23. }


客户端类
[java]
1. package com.bankht.Template;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-28 上午11:14:30
6. *
7. * @类说明 :客户端类
8. */
9. public class Client {
10.
11. public static void main(String[] args) {
12. Account account = new MoneyMarketAccount();
13. System.out.println("货币市场账号的利息数额为:" + account.calculateInterest());
14. account = new CDAccount();
15. System.out.println("定期账号的利息数额为:" + account.calculateInterest());
16. }
17.
18. }

运行一下:
[html]
1. MMA
2. 货币市场账号的利息数额为:7243.0*0.045=325.935
3. CDA
4. 定期账号的利息数额为:7243.0*0.06=434.58


________________________________________
模板方法模式在Servlet中的应用
  使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫Htt