type
status
date
slug
summary
tags
category
icon
password
模版方法模式
模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F65d4ffb2-72e1-44a3-ad02-f34e0784d56a%2FUntitled.png?table=block&id=5ec6d949-664d-47c6-bc9f-3b279c92171b&t=5ec6d949-664d-47c6-bc9f-3b279c92171b&width=1280&cache=v2)
类比真实世界中建造大量房屋。 标准房屋建造方案中可提供几个扩展点, 允许潜在房屋业主调整成品房屋的部分细节。
每个建造步骤 (例如打地基、 建造框架、 建造墙壁和安装水电管线等) 都能进行微调, 这使得成品房屋会略有不同。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F8ca44a7c-e7b8-48fe-9d87-9419ca078003%2Flive-example-2x.png?table=block&id=591ec567-2692-4fce-98d6-e7c7b5c458b7&t=591ec567-2692-4fce-98d6-e7c7b5c458b7&width=708&cache=v2)
模版方法模式结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F2c837bfa-5c53-4f1d-af17-4c4690b7683c%2Fstructure-indexed-2x.png?table=block&id=5835f692-03b0-4271-bb2e-7982c06f5edf&t=5835f692-03b0-4271-bb2e-7982c06f5edf&width=700&cache=v2)
- 抽象类 (AbstractClass) 会声明作为算法步骤的方法, 以及依次调用它们的实际模板方法。 算法步骤可以被声明为
抽象
类型, 也可以提供一些默认实现。
- 具体类 (ConcreteClass) 可以重写所有步骤, 但不能重写模板方法自身。
一般,模版方法都加上final关键字,不允许被覆写。
通用代码结构
模版方法模式适合应用场景
- 当你只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。
- 当多个类的算法除一些细微不同之外几乎完全一样时,你可使用该模式。但其后果就是,只要算法发生变化,你就可能需要修改所有的类。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F625fd697-b16a-4de8-8df9-3a4b2e98291a%2FUntitled.png?table=block&id=70a90e98-e052-4d94-a4dc-e128c5827a93&t=70a90e98-e052-4d94-a4dc-e128c5827a93&width=1703&cache=v2)
识别方法:模版方法可以通过行为方法来识别,该方法已有一个在基类中定义的 “默认” 行为。
模版方法模式优缺点
模版方法模式的优点
- 你可仅允许客户端重写一个大型算法中的特定部分, 使得算法其他部分修改对其所造成的影响减小。
- 你可将重复代码提取到一个超类中。
模版方法模式的缺点
- 部分客户端可能会受到算法框架的限制。
- 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
- 模板方法中的步骤越多, 其维护工作就可能会越困难。
练手题目
题目描述
小明喜欢品尝不同类型的咖啡,她发现每种咖啡的制作过程有一些相同的步骤,他决定设计一个简单的咖啡制作系统,使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型:美式咖啡(American Coffee)和拿铁(Latte)。咖啡制作过程包括以下步骤:
- 研磨咖啡豆 Grinding coffee beans
- 冲泡咖啡 Brewing coffee
- 添加调料 Adding condiments
其中,美式咖啡和拿铁的调料添加方式略有不同, 拿铁在添加调料时需要添加牛奶Adding milk
输入描述
多行输入,每行包含一个数字,表示咖啡的选择(1 表示美式咖啡,2 表示拿铁)。
输出描述
根据每行输入,输出制作咖啡的过程,包括咖啡类型和各个制作步骤,末尾有一个空行。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Ffbe401bd-e94c-40a1-8085-7a3fc1dc1d55%2FUntitled.png?table=block&id=909dcb6c-dbf6-499e-8555-c1bf87ffdb65&t=909dcb6c-dbf6-499e-8555-c1bf87ffdb65&width=776&cache=v2)
题解
模版方法实现。
欢迎您在底部评论区留言,一起交流~
- 作者:Nolan
- 链接:https://nolanblog.top/article/DP4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。