实例探索Java模式之路——模版方法模式

来源:互联网 发布:js拼图游戏源码 编辑:程序博客网 时间:2024/06/05 03:43
模版方法模式


1、模版方法模式是类的行为模式。
准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法迫使子类实现剩余的逻辑。
不同的子方法可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。


模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心。


2、基本结构:


抽象模版:
1、定义一个或者多个抽象操作,让子类实现,这些操作叫做基本操作。
2、定义并实现一个模版方法。这个模版方法是一个具体方法,它给出了一个顶级逻辑框架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也可能调用一些具体方法。
具体模版:
1、实现父类所定义的一个或多个抽象方法,他们是一个顶级逻辑的组成步骤。
2、每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。


3、一个示意性的例子:


//抽象模版类
public abstract class AbstractClass {
// 模版方法的声明和实现,顶级逻辑的方法代表
public void TemplateMethod() {
// 调用基本方法(子类实现)
doOperate1();// 顶级逻辑的组成步骤
// 调用基本方法(子类实现)
doOperate2();// 顶级逻辑的组成步骤
// 调用基本方法(已经实现)
doOperate3();
}


// 基本方法声明1
protected abstract void doOperate1();


// 基本方法声明2
protected abstract void doOperate2();


// 基本方法声明3(实现)
private final void doOperate3() {
System.out.println("模版方法具体实现3");
}
}


//具体策模版类
public class ConcreteClass extends AbstractClass {


// 基本方法1(子类实现)
@Override
protected void doOperate1() {
System.out.println("基本方法1,子类实现");


doOperate2();// 可以调用
// doOperate3();//不应当这样调用
}


// 基本方法2(子类实现)
@Override
protected void doOperate2() {
System.out.println("基本方法2,子类实现");


}
}
//客户端
public class client {


public static void main(String[] args) {


AbstractClass ab = new ConcreteClass();


ab.TemplateMethod();
}


}


4、一个计算存款利息的例子:


//抽象模版类,给出顶级逻辑
abstract public class Account {


protected String accountNumber;// 帐号


// 无参构造,初始化帐号
public Account() {
accountNumber = null;
}


// 构造方法
public Account(String accountNumber) {
this.accountNumber = accountNumber;
}


// 模版方法,计算利息数额
final public double calculateInterest() {
// 得到利率
double interestRate = doCalculateInterestRate();
// 得到帐号类型
String accountType = doCalculateAccountType();
// 得到帐号金额
double amount = calculateAccount(accountType, accountNumber);
// 计算利息数额
return amount * interestRate;
}


// 调用基本方法(子类实现)
abstract protected String doCalculateAccountType();


// 调用基本方法(子类实现)
abstract protected double doCalculateInterestRate();


// 基本方法声明(实现)
final public double calculateAccount(String accountType,
String accountNumber) {


// 查询数据库得到传入的账户类型和号码查询得到金额,返回帐号金额
return 100000.00D;


}
}


//具体子类
public class MoneyMarketAccount extends Account {


// 基本方法(子类实现)
@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}


// 基本方法(子类实现)
@Override
protected double doCalculateInterestRate() {
return 0.035D;
}


}


//具体子类
public class CDAccount extends Account {


// 基本方法(子类实现)
@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}


// 基本方法(子类实现)
@Override
protected double doCalculateInterestRate() {
return 0.065D;
}


}


import java.text.NumberFormat;


//客户端
public class client {
private static Account acttAccount = null;


// 金额格式化
private static String formateCurrency(double amnt) {
return NumberFormat.getCurrencyInstance().format(amnt);
}


public static void main(String[] args) {
acttAccount = new MoneyMarketAccount();


System.out.println("Interest from market account"
+ formateCurrency(acttAccount.calculateInterest()));


acttAccount = new CDAccount();


System.out.println("Interest from CD account"
+ formateCurrency(acttAccount.calculateInterest()));


}
}


5、模版方法模式中的方法(模版方法和基本方法)
模版方法:一个模版方法是定义在抽象类中,把基本操作方法组合在一起形成一个总的算法或者总的一个行为。一个抽象类可以有任意多个模版方法,每一个模版方法都可以任意调用任意多个具体放方法。
基本方法:(抽象方法、具体方法,钩子方法)
钩子方法:由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。例如上面的方法(doCalculateInterestRate()、doCalculateAccountType())实现方式就是钩子方法。钩子方法命名应当以do开始。


通过此实例,相信对该模式有了进一步的认识。

每天努力一点,每天都在进步。


原创粉丝点击