首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式-模板方法模式

2013-02-18 
设计模式-模板方法模式模板方法模式:类的行为模式。一个抽象类,将部分逻辑以具体方法以及具体构造的形式实

设计模式-模板方法模式

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

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

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

角色:

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

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

先来个例子:

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 {@Overrideprotected String doCalculateAccountType() {return null;}@Overrideprotected double doCalculateInterRate() {return 0;}}package cn.design.pattern.demo.templatemethod.demo.interesrate;public class CDAccount extends Account {@Overrideprotected String doCalculateAccountType() {return null;}@Overrideprotected double doCalculateInterRate() {return 0;}}

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

热点排行