我想在語言依賴的情況下,你可能會有一些對象被更新。
我會建議一個架構,其中所有語言依賴對象繼承一些基類(由您來看簡單繼承是足夠的還是多個繼承是必要的)。然後,虛擬功能將允許在必要時進行量身定製的語言操作。
基類將維護創建和刪除的所有對象的列表,並提供更新語言的刷新機制。喜歡的東西:
class LSensitive {
private:
static list<LSensitive*> l; // all language dependent objects
protected:
virtual void doChangeLanguage(string new_language) = 0;
/* derived class change labels, units, etc... */
public:
static void changeAll(string new_language) // call this when you want to change !
{ for (auto i = l.begin(); i != l.end(); i++)
(*i)->doChangeLanguage(new_language);
}
LSensitive()
{ l.push_front(this); }
virtual ~LSensitive()
{ l.remove(this); }
};
派生類會再量身定做更改語言代碼喜歡這裏:
class Class0 : public LSensitive {
private:
static int unique_id;
int myid;
public:
Class0() : myid(unique_id++) {};
~Class0() {};
void doChangeLanguage(string new_language) // implement the class specific change
{ cout << "Object " << myid << ": change language to " << new_language << endl; };
};
當CLASS3或任何其他地方你注意到,它的時間來改變語言,然後只需撥打:
LSensitive::changeAll(new_language);
最大的優點是,無論您創建或初始化語言相關對象,此代碼都會找到並更新它們。
觀察Observer模式。 – jready
除了設計模式等你需要的是'Object3'有一個引用或指針'ObjectA'。因此,當通過'Object3'完成語言改變時'ObjectA'通過這個參考/指針被更新。 – 101010