`

设计模式-模板方法模式

阅读更多

模板方法模式:类的行为模式。一个抽象类,将部分逻辑以具体方法以及具体构造的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。它包括轮廓和具体逻辑,轮廓即为模板方法,具体逻辑为基本方法。

模板方法:定义在抽象类中,把基本操作方法组合在一起形成一个总的行为,由子类不加修改地完全继承下来。一个抽象类 可以有多个模板方法,一个模板方法可以调用任意多个具体方法。

基本方法:分为抽象方法、具体方法、钩子方法;具体方法由抽象类声明并实现,有些能起到工厂方法的作用。钩子方法由抽象类声明并实现,而子类回加以扩展。通常抽象类给出的是一个空实现或默认实现。

角色:

      抽象模板角色:定义一个活多个抽象操作(基本操作),一边让子类实现;定义并实现一个模板方法。模板方法一般是一个具体方法,他给出了轮廓的骨架,而其中的逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。

      具体模板角色:实现父类所定义的一个或多个抽象方法,他们是一个轮廓的组成步骤;每个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得轮廓的实现各不相同。

先来个例子:

package cn.design.pattern.demo.templatemethod.demo.interesrate;

public abstract class Account {

	protected String accountNum;
	
	public Account() {
		accountNum = null;
	}
	
	public Account(String accountNum) {
		this.accountNum = accountNum;
	}
	
	/**
	 * 模板方法
	 * @return
	 */
	protected final double calculateRest() {
		double insertRate = doCalculateInterRate();
		String accountType = doCalculateAccountType();
		double amount = calculateAmount(accountType, accountNum);
		return amount * insertRate;
	}
	
	/**
	 * 两个基本方法, 由子类实现
	 * @return
	 */
	protected abstract String doCalculateAccountType();
	
	protected abstract double doCalculateInterRate();
	
	/**
	 * 基本方法,已经实现
	 * @param accountType
	 * @param accountNum
	 * @return
	 */
	protected final double calculateAmount(String accountType, String accountNum) {
		// 可能读取数据库数据
		return 12334D;
	}
}

package cn.design.pattern.demo.templatemethod.demo.interesrate;

public class MarketAccount extends Account {

	@Override
	protected String doCalculateAccountType() {
		return null;
	}

	@Override
	protected double doCalculateInterRate() {
		return 0;
	}

}

package cn.design.pattern.demo.templatemethod.demo.interesrate;

public class CDAccount extends Account {

	@Override
	protected String doCalculateAccountType() {
		return null;
	}

	@Override
	protected double doCalculateInterRate() {
		return 0;
	}

}

 在我们之前接触到得HttpServlet,正是用了模板方法模式:service方法是模板方法,其中调用doXXX方法,而doXXX方法则由子类实现具体业务。

1
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics