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

  |   0 评论   |   41 浏览

简介

定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现,模板方法可以使子类在不改变算法结构的情况下,重新定义算法的某些步骤,也可以通过钩子方法来特殊处理逻辑,该模式属于行为型。

适用场景

1、一次性实现一个算法不可变的部分,并将可变的部分留给子类来实现
2、各子类中公共的部分被提取出来到公共的父类中,避免重复的代码

优点

1、提高复用性
2、提高扩展性
3、符合开闭原则

缺点

1、类个数增加
2、增加系统实现的复杂性
3、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要修改

扩展

钩子方法
可以通过钩子方法来做一些细微的调整,从而实现不一样的功能。

代码示例

image.png
抽象类,定义了固定的算法,就是打开冰箱,放东西,关闭冰箱,有时候有些东西需要进行打包,预留了钩子方法来判断是否需要打包,默认是不打包的。

public abstract class AFridgeFrozen {
    protected final void fridgeFrozen(){
        openFridge();
        if(needPackThing()){
            packThing();
        }
        putThings();
        closeFridge();
    }
    final void openFridge(){
        System.out.println("打开冰箱门");
    }
    /**
     *  放东西不一样
     */
    abstract void putThings();
    final void closeFridge(){
        System.out.println("关闭冰箱门");
    }
    final void packThing(){
        System.out.println("对放入的东西进行打包");
    }
    /**
     * 钩子方法,需要的子类自己实现
     */
    protected boolean needPackThing(){
        return false;
    }
}

保鲜鸡蛋类

public class FridgeFrozenAgg extends AFridgeFrozen {
    @Override
    void putThings() {
        System.out.println("放鸡蛋");
    }
}

保鲜西瓜,需要进行打包

public class FridgeFrozenHalfWatermelon extends AFridgeFrozen {
    @Override
    void putThings() {
        System.out.println("放一半西瓜");
    }
    @Override
    protected boolean needPackThing() {
        return true;
    }
}

测试类

public class TemplateMethodTest {
    public static void main(String[] args) {
        AFridgeFrozen fridgeFrozen = new FridgeFrozenAgg();
        fridgeFrozen.fridgeFrozen();
        System.out.println("--------------华丽的分割线---------------------");
        AFridgeFrozen watermelon = new FridgeFrozenHalfWatermelon();
        watermelon.fridgeFrozen();
    }
}

输出结果

打开冰箱门
放鸡蛋
关闭冰箱门
--------------华丽的分割线---------------------
打开冰箱门
对放入的东西进行打包
放一半西瓜
关闭冰箱门

上面示例源码

源码分析

jdk中应用

AbstractList类中的方法
image.png
image.png
这里的方法没有final,所以子类也是可以自己定义逻辑的。

servlet中应用

HttpServlet类里面有doXXX方法,表示不同的操作,service组合了doXXX方法。
image.png

mybatis中应用

BaseExecutor
定义了一个算法方法
image.png
以下方法由子类来实现
image.png
由这几个子类继承了BaseExecutor抽象类
image.png

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论