iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

設計模式系列 第 24

Day24 - 模板模式(Template pattern)

  • 分享至 

  • xImage
  •  

介紹
定義一個流程或算法的架構,其細節則在子類中實作。

C++範例

#include <iostream>
#include <memory>

// 抽象漢堡類
class Burger
{
public:
    void Make()
    {
        // 製作漢堡都固定要加麵包、起司、肉片
        AddBread();
        AddCheese();
        AddMeat();
    }

    virtual ~Burger() = default;

protected:
    // 麵包、肉片的細節給子類去實作
    virtual void AddBread() = 0;
    virtual void AddMeat() = 0;

private:
    // 假設每個漢堡使用的起司都是相同的
    void AddCheese()
    {
        std::cout << "Burger adds normal cheese" << std::endl;
    }
};

class PorkBurger : public Burger
{
protected:
    // 豬肉漢堡的麵包、肉片細節
    void AddBread() override
    {
        std::cout << "PorkBurger adds white bread" << std::endl;
    }
    void AddMeat() override
    {
        std::cout << "PorkBurger adds pork" << std::endl;
    }
};

class BeefBurger : public Burger
{
protected:
    // 牛肉漢堡的麵包、肉片細節
    void AddBread() override
    {
        std::cout << "BeefBurger adds white bread" << std::endl;
    }
    void AddMeat() override
    {
        std::cout << "BeefBurger adds beef" << std::endl;
    }
};

int main()
{
    // 漢堡的製作流程是相同的,差別在於使用材料的區別

    std::unique_ptr<Burger> porkBurger = std::make_unique<PorkBurger>();
    porkBurger->Make();
    
    std::cout << std::endl;

    std::unique_ptr<Burger> beefBurger = std::make_unique<BeefBurger>();
    beefBurger->Make();

    return 0;
}

Output:

PorkBurger adds white bread
Burger adds normal cheese
PorkBurger adds pork

BeefBurger adds white bread
Burger adds normal cheese
BeefBurger adds beef

上一篇
Day23 - 觀察者模式(Observer pattern)
下一篇
Day25 - 訪問者模式(Visitor pattern)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言