You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在设计中将Interface概念与基类结合实现辣味牛肉披萨?

披萨店OOD设计:辣味Interface的正确实现方案

在C++中没有原生interface关键字,我们通过纯虚函数类模拟接口契约。结合装饰器模式可完美解决披萨制作与辣味特性的结合问题,同时遵循面向对象设计原则。

1. 核心类结构设计

1.1 披萨基类(Pizza)

定义所有披萨的核心行为契约:

#include <iostream>
#include <string>
#include <memory>

class Pizza {
public:
    virtual ~Pizza() = default; // 虚析构避免内存泄漏
    virtual void prepare() const = 0; // 制作披萨的核心方法
    virtual std::string getName() const = 0; // 获取披萨名称
};

1.2 辣味特性接口(SpicyInterface)

定义辣味特性的行为契约,确保所有具备辣味的类都实现该接口:

class SpicyInterface {
public:
    virtual ~SpicyInterface() = default;
    virtual void addSpicyIngredients() const = 0; // 添加辣味配料的标准方法
};

1.3 辣味装饰器(SpicyPizzaDecorator)

通过装饰器模式动态给任意披萨添加辣味特性,同时实现辣味接口:

class SpicyPizzaDecorator : public Pizza, public SpicyInterface {
private:
    std::unique_ptr<Pizza> wrapped_pizza; // 被装饰的披萨对象
public:
    // 构造函数传入要添加辣味的披萨
    SpicyPizzaDecorator(std::unique_ptr<Pizza> pizza) 
        : wrapped_pizza(std::move(pizza)) {}

    // 重写prepare:先执行原披萨制作,再添加辣味配料
    void prepare() const override {
        wrapped_pizza->prepare();
        addSpicyIngredients();
    }

    // 重写getName:在原名称后标注辣味
    std::string getName() const override {
        return wrapped_pizza->getName() + " (Spicy)";
    }

    // 实现辣味接口:具体添加辣味配料的逻辑
    void addSpicyIngredients() const override {
        std::cout << "Adding spicy chili flakes, hot sauce, and jalapeños..." << std::endl;
    }
};

1.4 具体披萨类(BeefPizza)

实现普通牛肉披萨的制作逻辑:

class BeefPizza : public Pizza {
public:
    void prepare() const override {
        std::cout << "Preparing Beef Pizza: adding seasoned beef, mozzarella cheese, tomato sauce, and crust..." << std::endl;
    }

    std::string getName() const override {
        return "Beef Pizza";
    }
};

2. 创建辣味牛肉披萨对象

通过装饰器包装普通牛肉披萨,动态添加辣味特性:

int main() {
    // 步骤1:创建普通牛肉披萨
    std::unique_ptr<Pizza> plain_beef_pizza = std::make_unique<BeefPizza>();
    // 步骤2:用辣味装饰器包装,得到辣味牛肉披萨
    std::unique_ptr<Pizza> spicy_beef_pizza = std::make_unique<SpicyPizzaDecorator>(std::move(plain_beef_pizza));

    // 测试制作流程
    spicy_beef_pizza->prepare();
    std::cout << "Final Pizza: " << spicy_beef_pizza->getName() << std::endl;

    return 0;
}

运行输出:

Preparing Beef Pizza: adding seasoned beef, mozzarella cheese, tomato sauce, and crust...
Adding spicy chili flakes, hot sauce, and jalapeños...
Final Pizza: Beef Pizza (Spicy)

3. 辣味Interface的正确使用原则

  • 契约优先:接口只定义行为标准(如addSpicyIngredients),不包含状态,确保所有实现类遵循统一规范。
  • 依赖抽象而非具体:若需扩展不同辣度(微辣、特辣),只需新建装饰器类实现SpicyInterface即可,无需修改现有披萨类,符合开闭原则。
  • 避免类膨胀:相比直接创建SpicyBeefPizza、SpicyCheesePizza等子类,装饰器模式将辣味特性与披萨本身解耦,避免类数量爆炸。
  • 多态调用:通过Pizza基类指针调用方法时,会自动触发装饰器逻辑,无需区分普通披萨和辣味披萨。

内容的提问来源于stack exchange,提问作者Oday Allaham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:23:22