设计模式行为模式(二)分析报告.doc
文本预览下载声明
第7章 行为模式(二)
7.1 模板方法模式(Template)
7.1.1 概念
1、名称
Template Method模式也叫模板方法模式,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为。
在作为抽象类的父类里,定义了一个具有固定算法并可以细分为多个步骤的模板方法(public),Template Method模式把这些可以被细分的可变步骤抽象为可以被子类重载的抽象方法(protected abstract),并通过在子类中的重载(重新定义),做到无需改变模板方法的算法步骤而可以重新定义该算法中的某些特定的步骤
2、结构
Template Method模式的图
图7-1 TemplateMethod模式结构
3、意图
准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
模板方法适用于以下情况:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。
控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面runBare()方法就只在runTest前面适用setUp方法。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。
可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。
5、角色
抽象模版(AbstractClass)角色
定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。
定义并实现了一个模版方法。这个模版方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
具体模版(ConcreteClass)角色
实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
让我们先来看一个具体的关于报税的简单例子
图7-2 结构图
package com.sanlian.mode.templateMethod;
/**
* 保税
* @author sanlian
* @version Nov 23, 2010 2:51:28 PM
*/
public abstract class BasicTax {
protected float income;// 你的收入
public void eportTax() {
// 计算一下你该给省政府交多少税
float sTax = calculateProvinceTax();
// 计算一下你该给国家政府交多少税
float fTax = calculateChinaTax();
// 算算你破产没
boolean ok = checkBankBalance(sTax + fTax);
if (!ok) {
// 申请破产
fileBankruptcy();
}
else {
// 如果没破产就把税交上吧
sendMoneyToGov(sTax + fTax);
}
}
protected abstract float calculateProvinceTax();
protected abstract float calculateChinaTax();
/**
* 检查银行帐号是否破产
* @param tax
* @return
*/
private boolean checkBankBalance(float tax){
return false;
}
/**
* 申请破产
*/
private void fileBankruptcy(){
System.out.println(破产....);
}
/**
* 上交税金
*/
private void sendMoneyToGov(float tax){
System.out.printl
显示全部