[学习笔记]设计模式[7]-{模板方法模式}

本文介绍了模板方法模式,一种设计模式,用于避免重复代码并确保良好的软件设计。通过使用抽象类定义算法骨架,并允许子类重新定义某些步骤,该模式帮助减少代码冗余,提高系统的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计原则

好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你

这个原则利用很形象的比喻,介绍了一种防止“依赖腐败”的方法。“依赖腐败”简单的说,就是当高层组件依赖低层组件,而同时低层组件又依赖高层组件。在这同时,还有另外的一个边侧组件依赖底层组件同时高层组件也依赖边侧组件。这样的情况,就是“依赖腐败”。这种设计十分差的设计,没有人能轻易搞懂你的系统是怎么设计的。

设计模式

这一章讲述的设计模式可以利用自己的特性来避免这种“依赖腐败”的情况发生。

模板方法模式

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

下面还是用具体的例子来解释模板方法模式:
下面是咖啡和茶的两个类中有两个冲泡的方法:

public void prepareCoffee(){
    boilWater();
    brewCoffeeGrinds();
    pourInCup();
    addSugarAndMilk();
}
public void prepareTea(){
    boilWater();
    steepTeaBag();
    pourInCup();
    addLemon();
}

很明显,这两个类中有很多重复的方法和代码。根据我们之前的原则,我们需要把这些重复的代码抽离出来,该怎么做呢?这里就是需要一个模板类了:

public abstract class Beverage{
    public void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    abstract void brew();
    abstract void addCondiments();
}

有了模板之后,咖啡和茶的类就可以简化如下:

public class Tea extends Beverage{
    public void brew(){
        //原来的steepTeaBag();
    }
    public void addCondiments(){
        //原来的addCondiments();
    }
}
public class Coffee extends Beverage{
    public void brew(){
        //原来的brewCoffeeGrinds();
    }
    public void addCondiments(){
        //原来的addSugarAndMilk();
    }
}

不知道你有没有发现,现在的茶和咖啡的类甚至都不需要事先冲泡的方法,只需要告诉模板自己特有的冲泡方法和调料即可。
原来重复的代码都消失了!
通过模板方法模式,算法的结构和算法的具体内容实现了解耦,子类并不需要明确的知道算法的整体步骤,只需要知道自己需要重新定义的算法就可以了。而对被继承的类而言,他也不需要知道子类具体实现了什么,只需要保证算法整体的骨架就可以了。

最后是模板方法模式的类图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值