面向对象的设计来建模通用设备

Ran*_*nju 5 c++ oop design-patterns system-design object-oriented-analysis

在一次采访中,我被问到以下面向对象的系统设计问题。

有多种设备,如 Echo show、Echo dot、Echo tab、智能微波炉、Fire 电视棒等。

  • 回声秀 - 它有显示屏和扬声器。它在电力供应下工作。
  • 回声点 - 它有扬声器。它依靠电力供应工作。
  • 回声选项卡 - 它有扬声器。它依靠电池供电工作。电池可以充电。
  • 智能微波炉 - 有屏幕显示。它依靠电力供应工作。
  • 消防电视棒 - 它有扬声器。它依靠电力供应工作。

所以基本上有 3 个类别,例如 - 扬声器/屏幕显示/扬声器和屏幕显示。还有两个类别,例如 - 电源/电池供电。可以对任何这些设备进行查询,例如打印状态。以下是每个设备的可能输出 -

  • Echo 显示 - “正在充电”或“未充电”,具体取决于是否连接到电源。该输出应该出现在屏幕和扬声器上。
  • 回声点 - “正在充电”或“未充电”,具体取决于它是否连接到电源。该输出应该来自扬声器。
  • Echo 选项卡 - “电池正在充电”或“电池未充电且电池电量为 70%”,具体取决于电池是否正在充电。该输出应该来自扬声器。
  • 智能微波炉 - “正在充电”或“未充电”取决于它是否连接到电源。该输出应该出现在屏幕上。
  • Fire 电视棒 - “正在充电”或“未充电”,具体取决于它是否连接到电源。该输出应该来自扬声器。

假设有用于在屏幕上说话和打印的内置类。如果我们将字符串传递给这些类对象,它们将执行各自的工作。

现在编写 4-5 个类来模拟此场景。

设计应该是可扩展的,这意味着如果明天任何新设备带有新的组合,那么它可以在不创建任何新类的情况下实现。所以你不应该为每个设备创建类。

这是我的面向对象的解决方案,但面试官对此并不满意,尤其是vector<Output*> outputs. 他建议使用一些设计模式而不是矢量。你能想出更好的解决方案吗?

class Output {
   public:
    virtual void print(string);
};
class Display : public Output {
    DisplayScreen obj;
   public:
      void print(string str) { obj.print(str); }
};
class Speaker : public Output {
    Audio obj;
   public:
      void print(string str) { obj.print(str); }
};
class PowerSupply {
   public :
    virtual string get_status();
};
class BatteryPower : PowerSupply {
   bool isCharging;
   int chargeLevel;
   public :
     string get_status();
};
class ElectricPower : PowerSupply {
   bool isCharging;
   public :
     string get_status();
};
class Device {
    vector<Output*> outputs;//I used vector because Echo show has both display and speaker
    PowerSupply powersupply;
    Device(vector<Output> &outputs, PowerSupply powersupply) {
        this->outputs = outputs;
        this->powersupply = powersupply;
     }
};
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 4

vector<Output>不允许继承,因为它Output直接存储 s 而不是指针或引用。如果将Displayor存储Speaker在向量中,它将被切片

由于每个设备的输出都是唯一的,因此我会将其设为唯一指针的向量:

std::vector<std::unique_ptr<Output>> outputs;
Run Code Online (Sandbox Code Playgroud)