模板方法模式概念?
模板方法模式(Template Method Pattern)屬于行為型設計模式,其核心思想是在一個抽象類中定義一個算法的骨架,而將一些步驟延遲到子類中實現。這樣可以使得子類在不改變算法結構的情況下,重新定義算法中的某些步驟。它通過繼承機制,實現代碼復用和行為擴展,減少重復代碼,提升程序的可維護性和擴展性。
模板方法模式結構?
在模板方法模式中,主要包含以下角色:?
抽象類(Abstract Class):定義了模板方法,給出一個算法的骨架,由抽象方法和具體方法組成。抽象方法由子類實現,具體方法則是已經實現好的方法,在模板方法中被調用。?
具體子類(Concrete Class):實現抽象類中的抽象方法,從而完成特定的算法步驟。
需要記住一句話:“你不要調用我,讓我來調用你”
實例: 制作不同類型的飲品
我們要制作不同類型的飲品,如咖啡和茶,它們的制作流程相似,都包含煮水、沖泡、倒入杯子等步驟,但沖泡的細節有所不同。我們可以使用模板方法模式來實現這個場景。
#include <iostream>
#include <string>// 抽象類,定義飲品制作的模板方法
class Beverage {
public:// 模板方法,定義飲品制作的算法骨架void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}protected:// 具體方法,煮水,所有飲品制作都相同void boilWater() {std::cout << "Boiling water" << std::endl;}// 具體方法,倒入杯子,所有飲品制作都相同void pourInCup() {std::cout << "Pouring into cup" << std::endl;}// 抽象方法,沖泡,由子類實現virtual void brew() = 0;// 抽象方法,添加調料,由子類實現virtual void addCondiments() = 0;
};// 具體子類,咖啡
class Coffee : public Beverage {
protected:void brew() override {std::cout << "Brewing coffee grounds" << std::endl;}void addCondiments() override {std::cout << "Adding sugar and milk" << std::endl;}
};// 具體子類,茶
class Tea : public Beverage {
protected