【一天一个设计模式】—— 模板方法模式 (Template Method Pattern)

定义

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

通过定义可知,模板方法模式的作用为在不改变模板结构的前提下在子类中重新定义模板中的内容。注意,模板方法模式是基于”继承“的

UML图
在这里插入图片描述
模板方法模式的结构十分简单,由抽象模板具体模板构成,子类通过重写父类中的抽象方法使得在不改变模板结构的前提下重新定义其表达。

1.抽象模板AbstractClass,其中的方法分为两类:

1. 基本方法
基本方法也叫做基本操作,是由子类实现的方法,并在模板方法被调用。

2. 模板方法
一般是一个具体方法,实现对基本方法的调度。一般模板方法都加上final关键字,其不允许被重写。

2.具体模板ConcreteClass

实现父类所定义的一个或多个抽象方法(基本方法)。


代码:

冲奶粉和冲咖啡的步骤一致,只有一些细节不同。

1.创建抽象类

public abstract class MakeDrink{

	//模板
    final void process() {
        boilWater();
        brew();
        pourInCup();
        addSugar();
    }

    abstract void brew();

    abstract void addSugar();

    void boilWater() {
        System.out.println("boilWater");
    }

    void pourInCup() {
        System.out.println("pourInCup");
    }
}

2.创建子类

public class Milk extends MakeDrink{
    @Override
    void brew() {
        System.out.println("Milk.brew");
    }

    @Override
    void addSugar() {
        System.out.println("Milk.addSugar");
    }
}
public class Coffee extends MakeDrink{
    @Override
    void brew() {
        System.out.println("Coffee.brew");
    }

    @Override
    void addSugar() {
        System.out.println("Coffee.addSugar");
    }
}

3.测试

public class Test{
    public static void main(String[] args) {
        MakeDrink makeDrink = new Coffee();
        makeDrink.process();
        
        System.out.println();
        
        makeDrink = new Milk();
        makeDrink.process();
    }
}

上述代码中,我们将相同部分的代码放在抽象的父类中,将不同的代码放入不同的子类中,子类在不改变父类模板的前提下通过重写特定的方法扩展了父类不同的行为,提高了代码复用性,父类中的模板方法需要使用final关键字,防止被恶意重写。


总结

1.优点

  1. 提高代码复用性 将相同部分的代码放在抽象的父类中提高了拓展性 。
  2. 在不改变父类模板结构下对子类扩展从而增加新的行为,实现了反向控制,符合开闭原则。

2.缺点

  1. 每一个不同的实现都需要一个子类来实现,导致子类的个数增加,使系统膨胀。

3.使用场景

  1. 多个子类有共有的方法,并且逻辑基本相同时。
  2. 重要且复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uranus^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值