模板方法模式是我们经常在设计程序的时候使用到,比如安卓程序中经常定义BaseActivity或者重写BaseAdapter来实现一部分代码并开放相关的代码用于业务逻辑以及后续开发者能在既定的开发思路下进行规则化的开发。现在就来理一下这种思想下的理论基础。
设计模式分为三大类:
创建型模式
共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式
共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式
共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
还有两类
并发型模式和线程池模式。
先看一下使用模板方法模式思维写出来的代码:
public abstract class Account {
/**
* 模板方法,计算利息数额
*
* @return 返回利息数额
*/
public final double calculateInterest() {
double interestRate = doCalculateInterestRate();
String accountType = doCalculateAccountType();
double amount = calculateAmount(accountType);
return amount * interestRate;
}
/**
* 基本方法留给子类实现
* 抽象方法由抽象类声明,由具体子类实现。
* 在Java语言里抽象方法以abstract关键字标示
*/
protected abstract String doCalculateAccountType();
/**
* 基本方法留给子类实现
*/
protected abstract double doCalculateInterestRate();
/**
* 基本方法,已经实现;
* 一个具体方法由抽象类声明并实现,而子类并不实现或置换
*/
private double calculateAmount(String accountType) {
/**
* 省略相关的业务逻辑
*/
return 7243.00;
}
}由两个子类实现上面的方法:
public class CDAccount extends Account {
@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}
@Override
protected double doCalculateInterestRate() {
return 0.06;
}
}以及:
public class MoneyMarketAccount extends Account {
@Override
protected String doCalculateAccountType() {
return "Money Market";
}
@Override
protected double doCalculateInterestRate() {
return 0.045;
}
}使用Client程序进行测试:
public class Client {
public static void main(String[] args) {
Account account;
account = new MoneyMarketAccount();
System.out.println("货币市场账号的利息数额为:" + account.calculateInterest());
account = new CDAccount();
System.out.println("定期账号的利息数额为:" + account.calculateInterest());
}
}
货币市场账号的利息数额为:325.935
定期账号的利息数额为:434.58
模板方法模式基本上很接近框架的思维,给出了顶层的设计思想,抽象部分细节到子类去实现,往白了说:就是abstract类的精准使用;
模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。
模板方法模式需要开发抽象类和具体子类的设计师之间的协作。
模板方法所代表的行为称为顶级行为,其逻辑称为顶级逻辑。
抽象模板(Abstract Template)角色有如下责任:
定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。
定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
具体模板(Concrete Template)角色又如下责任:
实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。
具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。
钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
命名规则是设计师之间赖以沟通的管道之一,使用恰当的命名规则可以帮助不同设计师之间的沟通。
钩子方法的名字应当以do开始,这是熟悉设计模式的Java开发人员的标准做法。在上面的例子中,钩子方法hookMethod()应当以do开头;在HttpServlet类中,也遵从这一命名规则,如doGet()、doPost()等方法。
本文深入探讨了设计模式中的模板方法模式,通过实例演示了如何利用抽象类和具体子类实现代码复用,适用于希望理解该模式核心原理及其应用场景的开发者。
271

被折叠的 条评论
为什么被折叠?



