模版方法模式

定义

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤.在软件工程中,它是一种软件设计模式,和C++模板没有关连.–维基百科

案例

首先看一个最常见的模版方法,Spring中的org.springframework.context.support.AbstractApplicationContext#refresh方法,它是IOC容器的入口,定义了初始化流程,其中公共的执行逻辑,在父类中实现,对于不同的实现,在子类中去实现即可,Spring中几乎所有的扩展都运用了模版方法.
麦子、水稻是人类主要的作物,它们大致的一生为播种 --》灌溉 --》施肥 --》除草 --》收割 --》加工 --》食用,其中播种、灌溉、加工、食用两者相差非常大,而施肥、除草、收割几乎相同,下面用代码说明,
首选定义FooldLife:

public abstract class FooldLife {
    public void fooldLife() {
        sowing();
        irrigation();
        fertilization();
        weeding();
        harvest();
        machining();
        harvest();
        edible();
    }

    // 播种
    protected void sowing() {
        // 空方法,具体逻辑由子类实现
    }

    // 灌溉
    protected void irrigation() {
        // 空方法,具体逻辑由子类实现
    }

    // 施肥 公共实现
    protected void fertilization() {
        // ... 具体实现
        System.out.println("施肥---");
    }

    // 除草 公共实现
    protected void weeding() {
        // ... 具体实现
        System.out.println("除草---");
    }

    // 收割 公共实现
    protected void harvest() {
        // ... 具体实现
        System.out.println("收割---");
    }

    // 加工
    protected void machining() {
        // 空方法,具体逻辑由子类实现
    }

    // 食用
    protected void edible() {
        // 空方法,具体逻辑由子类实现
    }

}

子类RiceLife:

public class RiceLife extends FooldLife {
    @Override
    protected void sowing() {
        // 具体实现
        System.out.println("播种---");
    }

    @Override
    protected void irrigation() {
        // 具体实现
        System.out.println("灌溉---");
    }

    @Override
    protected void machining() {
        // 具体实现
        System.out.println("加工---");
    }

    @Override
    protected void edible() {
        // 具体实现
        System.out.println("食用---");
    }
}

子类WheatLife:

public class WheatLife extends FooldLife {
    @Override
    protected void sowing() {
        // 具体实现
        System.out.println("播种---");
    }

    @Override
    protected void irrigation() {
        // 具体实现
        System.out.println("灌溉---");
    }

    @Override
    protected void machining() {
        // 具体实现
        System.out.println("加工---");
    }

    @Override
    protected void edible() {
        // 具体实现
        System.out.println("食用---");
    }
}

FooldLife中的fooldLife方法描述了作物的一生,fertilizationweedingharvest方法为公共方法;而其他方法需求子类去重写,也就是空方法(钩子),子类可以由该方法控制父类,通过以上总结下模版方法模式:

  1. 代码复用性
    公共代码由父类实现,子类复用
  2. 可扩展性
    子类可以对父类方法扩展、功能加强

参考

  1. https://blog.youkuaiyun.com/z69183787/article/details/65628166
  2. https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值