设计模式——模板方法模式

定义


Define the skeleton of an algorithm in an operation , deferring some steps to subclass. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’ s structure.

使用场景


  • 多个子类公有的方法,且逻辑基本相同时。
  • 重要、复杂的算法,可以将核心算法设计为模板方法,周边相关细节功能由各子类实现。

UML


示例


抽象模板类

public abstract class AbstractClass {

    protected abstract void method1();

    protected abstract void method2();

    /**
     * 为防止恶意操作,模板方法禁止覆写
     */
    public final void templateMethod(){
        method1();
        method2();
    }

}

具体模板类

public class ConcreteClass1 extends AbstractClass{
    @Override
    protected void method1() {
        System.out.println("ConcreteClass1 method1");
    }

    @Override
    protected void method2() {
        System.out.println("ConcreteClass1 method2");
    }
}

场景类

public class Client {
    public static void main(String[] args){
        AbstractClass abstractClass1 = new ConcreteClass1();

        abstractClass1.templateMethod();
    }
}

优点


  • 封装不变部分,扩展可变部分
  • 提取公共部分,便于维护
  • 行为由父类控制,由子类实现

局限


  • 子类对父类产生类影响,带来代码阅读的难度

扩展


钩子方法

public abstract class AbstractClass {

    protected abstract void method1();

    protected abstract void method2();

    /**
     * 为防止恶意操作,模板方法禁止覆写
     */
    public final void templateMethod(){
        method1();
        if(hookMethod())
            method2();
    }

    /**
     * 钩子方法
     */
    protected boolean hookMethod(){
        return true;
    }

}

具体模板类

public class ConcreteClass1 extends AbstractClass {
    private boolean isHook;
    @Override
    protected void method1() {
        System.out.println("ConcreteClass1 method1");
    }

    @Override
    protected void method2() {
        System.out.println("ConcreteClass1 method2");
    }

    public void setHook(boolean hook) {
        isHook = hook;
    }

    @Override
    protected boolean hookMethod() {
        return isHook;
    }
}

场景类

public class Client {
    public static void main(String[] args){
        ConcreteClass1 concreteClass1 = new ConcreteClass1();
        concreteClass1.setHook(true);
        concreteClass1.templateMethod();
    }
}

END ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值