概要:
该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了模板模式的原理及展示了模板模式的示例;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文:
模板模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1.模板模式代码示例
抽象交易流程
/**
* 交易流程
* @author Administrator
*
*/
public abstract class TransactionProcess {
//开始
public abstract void start();
//竞价
public abstract void Bidding();
//交易
public abstract void transaction();
//结束
public abstract void over();
//整个过程,模板模式核心所在
public void process(){
//开始
this.start();
//是否竞价,钩子方法
if(this.isBidding()){
this.Bidding();
}
//交易
this.transaction();
//结束
this.over();
}
//判断过程中是否需要竞价,默认需要
public boolean isBidding(){
return true;
}
}
普通买卖交易方式
/**
* 普通买卖,用户决定是否需要竞价这个环节
* @author Administrator
*
*/
public class GeneralTransaction extends TransactionProcess{
//用于传递用户是否需要竞价的这个参数
private boolean biddingFlag = true;
@Override
public void start() {
System.out.println("普通买卖:开始...");
}
@Override
public void Bidding() {
System.out.println("普通买卖:竞价...");
}
@Override
public void transaction() {
System.out.println("普通买卖:交易...");
}
@Override
public void over() {
System.out.println("普通买卖:结束...");
}
//重写是否需要竞价的方法,由用户决定
@Override
public boolean isBidding(){
return this.biddingFlag;
}
//用户传入普通买卖是否需要竞价
public void setBidding(boolean isBidding){
biddingFlag = isBidding;
}
}
拍卖交易方式
/**
* 拍卖,肯定需要竞价,此处是否需要竞价这个环节的方法无需重写
* @author Administrator
*
*/
public class Auction extends TransactionProcess{
@Override
public void start() {
System.out.println("拍卖:开始...");
}
@Override
public void Bidding() {
System.out.println("拍卖:竞价...");
}
@Override
public void transaction() {
System.out.println("拍卖:交易...");
}
@Override
public void over() {
System.out.println("拍卖:结束...");
}
}
模拟交易过程
/**
* 模拟交易过程
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
/**
* 模拟普通交易,设置为不需要竞价环节,如需要竞价,false改为true
*/
GeneralTransaction generalTransaction = new GeneralTransaction();
generalTransaction.setBidding(false);
/*输出
普通买卖:开始...
普通买卖:交易...
普通买卖:结束...*/
generalTransaction.process();
/**
* 模拟拍卖,需要竞价
*/
Auction auction = new Auction();
/*输出
拍卖:开始...
拍卖:竞价...
拍卖:交易...
拍卖:结束...*/
auction.process();
}
}
注:
1.此示例中,交易流程的结构是已经封装好的,但是普通买卖和拍卖在是否需要竞价环节这个问题上有差异,因此此处普通买卖方式在不改变整体架构的前提条件下对竞价这个特定步骤进行了取舍。
2.钩子方法:不破坏整体架构的前提下,随着外界条件改变,可以影响到模板方法的执行的方法。