JAVA的23种设计模式---模板模式

概要:

该文章参考了《设计模式之禅》一书及一些前辈的博客文章

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.钩子方法:不破坏整体架构的前提下,随着外界条件改变,可以影响到模板方法的执行的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值