在面试中,我被问到了以下面向对象系统设计问题。
有多个设备,例如Echo Show、Echo Dot、Echo Tab、智能微波炉、Fire TV Stick等。
- Echo Show - 它有显示屏和扬声器。它使用电力供应。 - Echo Dot - 它有扬声器。它使用电源供应。 - Echo Tab - 它有扬声器。它使用电池供应。电池可以充电。 - 智能微波炉 - 它有屏幕显示。它使用电源供应。 - Fire TV Stick - 它有扬声器。它使用电源供应。
所以基本上这些是3个类别——扬声器/屏幕显示/扬声器和屏幕显示
有两个类别——电源供应/电池供应。
可以对任何这些设备进行查询,比如打印状态。以下是每个设备的可能输出:
- Echo Show - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应出现在屏幕和扬声器上。 - Echo Dot - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在扬声器上。 - Echo Tab - 根据电池是否正在充电,输出“电池正在充电”或“电池未充电且电量为70%”。此输出应只出现在扬声器上。 - 智能微波炉 - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在屏幕上。 - Fire TV Stick - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在扬声器上。
假设有内置的类来说话和打印屏幕。如果我们将字符串传递给这些类对象,它们将执行相应的工作。
现在编写4-5个类来模拟此场景。
设计应具有可扩展性,这意味着如果明天有任何新设备带有新组合,则可以实现它而不创建任何新类。因此,您不应为每个设备创建类。
以下是我的面向对象解决方案,但是面试官对
有多个设备,例如Echo Show、Echo Dot、Echo Tab、智能微波炉、Fire TV Stick等。
- Echo Show - 它有显示屏和扬声器。它使用电力供应。 - Echo Dot - 它有扬声器。它使用电源供应。 - Echo Tab - 它有扬声器。它使用电池供应。电池可以充电。 - 智能微波炉 - 它有屏幕显示。它使用电源供应。 - Fire TV Stick - 它有扬声器。它使用电源供应。
所以基本上这些是3个类别——扬声器/屏幕显示/扬声器和屏幕显示
有两个类别——电源供应/电池供应。
可以对任何这些设备进行查询,比如打印状态。以下是每个设备的可能输出:
- Echo Show - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应出现在屏幕和扬声器上。 - Echo Dot - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在扬声器上。 - Echo Tab - 根据电池是否正在充电,输出“电池正在充电”或“电池未充电且电量为70%”。此输出应只出现在扬声器上。 - 智能微波炉 - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在屏幕上。 - Fire TV Stick - 根据它是否连接到电源供应,输出“正在充电”或“未在充电”。此输出应只出现在扬声器上。
假设有内置的类来说话和打印屏幕。如果我们将字符串传递给这些类对象,它们将执行相应的工作。
现在编写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;
}
};
std::vector<Output>
明显是错误的,而std::vector<Output*>
差不多还可以。我本来想将这个问题标记为重复的,但已经有一个答案了,我认为这个答案能够更好地解释问题,因此我只是放了链接。 - 463035818_is_not_a_numberprint(string)
应为const
。 在我看来,问题在于你没有与面试官沟通:“你有想到哪种模式?”或者“应该针对vector
的哪个具体问题?” 我个人不太喜欢你使用vector
的理由。为什么不将Device
作为一个带有非类型模板参数std::size_t kOutputCount
的模板类,并为Device<1ULL>
进行模板特化呢? 此外,this->outputs
是一个指向Output*
的vector
,而不是Output
的vector
…… 哦,还有那个构造函数是private
的。 - viraltaco_