【设计模式】模板方法模式

定义

在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

优点

  • 模板类主导一切,拥有且保护算法。算法修改方便。
  • 新增加一个实现类,只需要重写自己的方法就可以了。
  • 模板类专注算法本身,由子类提供完整的实现。
定义一个模板
/**
 * 定义的抽象类,它被声明为抽象,作为基类
 */
public abstract class AbstractClass {
    /**
     * 模板方法,定义了该方法包含的一连串操作
     */
    final void templateMethod(){
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation1();
        concreteOperation2();
    }

    /**
     * 操作1:需子类实现具体操作
     */
    abstract void primitiveOperation1();

    /**
     * 操作2:需子类实现具体操作
     */
    abstract void primitiveOperation2();

    /**
     * 具体方法,子类无法重写
     */
    final void concreteOperation1(){
        //do something
    }

    /**
     * 具体方法,子类视情况是否重写
     */
    void concreteOperation2(){
        //do something
    }
}
模板中增加钩子

钩子是以重被声明在抽象类中的方法,可以让子类有能力对算法的不同点进行挂钩。

/**
 * 定义的抽象类,它被声明为抽象,作为基类
 */
public abstract class AbstractClassWithHook {
    /**
     * 模板方法,定义了该方法包含的一连串操作
     */
    final void templateMethod(){
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation1();

        //满足某条件才执行操作2
        if (matchAnyCondition()) {
            concreteOperation2();
        }
    }

    /**
     * 操作1:需子类实现具体操作
     */
    abstract void primitiveOperation1();

    /**
     * 操作2:需子类实现具体操作
     */
    abstract void primitiveOperation2();

    /**
     * 具体方法,子类无法重写
     */
    final void concreteOperation1(){
        //do something
    }

    /**
     * 具体方法,子类视情况是否重写
     */
    void concreteOperation2(){
        //do something
    }

    /**
     * 自定义的钩子,子类可以覆盖这个方法,根据实际条件返回true or false
     * @return
     */
    boolean matchAnyCondition() {
        //return true or false,子类可以重写
        return true;
    }
}

【参考】
[1] Head First 设计模式
[2] https://github.com/iluwatar/java-design-patterns/tree/master/template-method

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值