模板方法模式

1、什么是模板方法模式?

  算法执行的统一框架(step1、step2……、stepn)。
  父类定义了实现步骤的框架,然后子类可以在不改变父类框架的基础上增加或者修改父类的一些方法。

2、如何实现模板方法模式

  以银行柜台办理业务为例实现模板方法模式。
  流程可分为,取号->排队->办理业务->销号。
  BankBusiness.java

/**
 * 银行业务抽象类(抽象基类,为所有子类提供一个算法框架)
 */
public abstract class BankBusiness {
    // final的模板方法,防止子类修改
    final public void bankBusinessTemplate() {
        // 调用各个流程方法
        takeNo();
        if (isSpecialUser()) {
            queueUp();
        }
        handleBusiness();
        destroyNo();
    }

    // 取号
    private void takeNo() {
        System.out.println("取号");
    }

    // 排队
    private void queueUp() {
        System.out.println("排队");
    }

    // 办理业务(定义为protected,在子类中延迟实现,提供个性化操作)
    protected abstract void handleBusiness();

    // 销号
    private void destroyNo() {
        System.out.println("销号");
    }

    // 钩子方法,有效调控公用变化的流程
    protected boolean isSpecialUser() {
        return true;
    }
}

  OpenNewCardBankBusiness.java

/**
 * 办理新卡业务
 */
public class OpenNewCardBankBusiness extends BankBusiness {

    @Override
    protected void handleBusiness() {
        System.out.println("柜台业务,办新卡");
    }

}

  destroyCardBankBusiness.java

/**
 * 销卡业务
 */
public class destroyCardBankBusiness extends BankBusiness {

    @Override
    protected void handleBusiness() {
        System.out.println("柜台业务,销卡");
    }

}

  BankBusinessTest.java

/**
 * 测试类
 * 
 */
public class BankBusinessTest {

    public static void main(String[] args) {
        BankBusiness busi;
        busi = new OpenNewCardBankBusiness();
        busi.bankBusinessTemplate();
        System.out.println();
        busi = new destroyCardBankBusiness();
        busi.bankBusinessTemplate();
    }

}

  运行结果

取号
排队
柜台业务,办新卡
销号

取号
排队
柜台业务,销卡
销号

  准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。

3、模板方法模式的特点

优点

  • 封装性好
  • 复用性好
  • 屏蔽细节

缺点:

  每个不同的实现需要增加新类,类个数增多。

4、模板方法模式的适用场景

  1. 算法或操作逻辑相似的逻辑
  2. 重构时(把相同的代码抽取到父类中)
  3. 重要、复杂的算法,核心算法设计为模板算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值