【发布时间】:2022-01-23 18:22:57
【问题描述】:
我在一次采访中被问到以下面向对象的系统设计问题。
有多种设备,如 Echo show、Echo dot、Echo tab、智能微波炉、Fire tv Stick 等。
- 回声秀 - 它有显示屏和扬声器。它适用于电源。
- 回声点 - 它有扬声器。它适用于电力供应。
- 回声标签 - 它有扬声器。它适用于电池供电。电池可以充电。
- 智能微波炉 - 它有屏幕显示。它适用于电力供应。
- 消防电视棒 - 它有扬声器。它适用于电力供应。
所以基本上这些是 3 个类别,例如 - 扬声器/屏幕显示/扬声器和屏幕显示 有两类,如 - 电源/电池供应。 可以在任何这些设备上进行查询,例如打印状态。以下是每个设备的可能输出 -
- 回声显示 - “它正在充电”或“它没有充电”,具体取决于它是否连接到电源。此输出应出现在屏幕和扬声器上。
- 回声点 - “正在充电”或“未在充电”,具体取决于它是否连接到电源。此输出应来自扬声器。
- 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;
}
};
【问题讨论】:
-
@463035818_is_not_a_number 为什么要粘贴对象切片的链接?如果我将 vector
-
我们不知道究竟是什么让面试官不高兴,但
std::vector<Output>肯定是错误的,std::vector<Output*>是好的。我正在考虑将问题作为重复问题关闭,但已经有一个答案可以帮助我更好地解释,所以我放弃了链接。 -
我将“vector
输出”更改为“vector 输出”以澄清混淆。面试官建议使用一些设计模式而不是矢量。 -
旁注:
print(string)应该是const。在我看来,问题在于你没有与面试官沟通:“你想到了哪种模式?”或“应该针对vector的哪个特定问题?”。我个人不赞成您使用vector的理由。为什么不使用非类型模板参数std::size_t kOutputCount和Device<1ULL>的模板特化来创建Device模板类?此外,this->outputs是vector的Output*不是Output... 哦。那个构造函数是private
标签: c++ oop design-patterns object-oriented-analysis system-design