如何在设计中将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
相关产品推荐
相关产品推荐

