該賞金過期4天。此問題的答案有資格獲得 100聲望獎勵。 Ranju正在尋找可靠訊息來源的答案。
我在面試中被問到以下面向物件的系統設計問題。
有多種設備,如 Echo show、Echo dot、Echo tab、智能微波爐、Fire 電視棒等。
- 回聲表演 - 它有顯示屏和揚聲器。它適用于電力供應。
- Echo dot - 它有揚聲器。它適用于電力供應。
- Echo 選項卡 - 它有揚聲器。它適用于電池供電。電池可以充電。
- 智能微波爐 - 它有螢屏顯示。它適用于電力供應。
- 消防電視棒 - 它有揚聲器。它適用于電力供應。
所以基本上這些是 3 個類別,例如 - 揚聲器/螢屏顯示/揚聲器和螢屏顯示有兩個類別,例如 - 電源/電池供電。可以對這些設備中的任何一個進行查詢,例如列印狀態。以下是每個設備的可能輸出 -
- 回聲顯示 - “正在充電”或“未充電”取決于它是否連接到電源。此輸出應出現在螢屏和揚聲器上。
- 回聲點 - “正在充電”或“未充電”取決于它是否連接到電源。此輸出應出現在揚聲器上。
- Echo 選項卡 - “電池正在充電”或“電池未充電且電池電量為 70%”取決于電池是否正在充電。此輸出應出現在揚聲器上。
- 智能微波爐 - “正在充電”或“未充電”取決于是否連接到電源。這個輸出應該出現在螢屏上。
- 消防電視棒 - “正在充電”或“未充電”取決于它是否連接到電源。此輸出應出現在揚聲器上。
假設有用于在螢屏上說話和列印的內置類。如果我們將字串傳遞給這些類物件,它們將完成各自的作業。
現在撰寫 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;
}
};
uj5u.com熱心網友回復:
vector<Output>不允許繼承,因為它Output直接存盤s 而不是指標或參考。如果您將 aDisplay或存盤Speaker在向量中,它將被切片。
由于每個設備的輸出都是唯一的,我會將其設為唯一指標的向量:
std::vector<std::unique_ptr<Output>> outputs;
uj5u.com熱心網友回復:
我認為面試官要求使用某種設計模式在任何方面都沒有建設性。設計模式是完成某事的工具;沒有目標,設計模式就毫無意義。相反,他可以說:“我們期望必須構建許多具有最小偏差的類似設備。你將如何實作這一點? ”插入“現在標記隨機設計模式,我們是金子。 ”。
除了技術問題John Kugelman 在這里回答。我認為您可以使用多種設計模式,而不僅僅是傳入設備和電源的向量。我頭頂上的一些例子:
工廠模式
研究關鍵詞:工廠模式
class DotFactory
{
DotFactory(/*maybe you need parameters*/);
Device* getDevice(/*more parameters e.g. speaker count*/);
}
建造者模式
研究關鍵詞:建造者模式
根據復雜性和用例,您可以將設備構建器集成到設備中。為簡單起見,我是這樣做的。
class Device
{
// Your stuff
vector<Output*> outputs;
PowerSupply powersupply;
Device(vector<Output*> &outputs, PowerSupply *powersupply);
// Builder functions
bool addPowerSupply(PowerSupply*);
bool addOutput(Output*);
// If outside your Device class also integrate:
Device* getBuiltDevice();
};
其他模式和組合(我期待想出不止一種。也許有人可以編輯更多。)
單例設備串列(大多數情況下是反模式)
如果每個應用程式只需要一個,則根據用例,您還可以擁有任何東西(方法、容器、類等)來保存預定義的“設備”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395609.html
下一篇:將串聯值插入表中
