2010-04-30 71 views
3

我有持有任意狀態的一類,它的定義是這樣的:選擇那些可能改變其內在屬性一類的設計模式

class AbstractFoo 
{ 
}; 

template <class StatePolicy> 
class Foo : public StatePolicy, public AbstractFoo 
{ 
}; 

國家政策只包含受保護的屬性是代表國家。
狀態可能對於多個行爲是相同的,並且它們可以在運行時被替換。
所有Foo對象都具有相同的接口來抽象狀態本身並允許在容器中存儲Foo對象。
我想找到最簡單和最可維護的方式來表達這一點。

編輯:
這裏是我的問題的一些詳細信息:
富是代表了某個硬件可以改變物理或通過UI的狀態和行爲類(或有多個用戶界面)。
我還有四個問題:
1)信號/插槽機制會做什麼?
2)是否可以綁定Foo中的某個插槽發出的每個信號,使其具有指向Foo的指針,就像它是成員類一樣?
3)我是否應該使用訪問者而不是將Foo作爲訪問類?
4)爲什麼StatePolicy設計不好?

下面是更新API:

class AbstractFoo 
{ 
public: 
    virtual void /*or boost::signal*/ notify() = 0; // Updates the UI. 
    virtual void /*or boost::signal*/ updateState() = 0 // Updates the state 
}; 
+0

虛擬函數,多態性或存儲指向對象的指針會有幫助嗎?對不起,我只是想了解你的問題。 – 2010-04-30 02:35:54

+0

當然由於界面相同,存在虛擬功能。但是,每個對象的API的行爲可能會在運行時發生變化。 – 2010-04-30 02:40:42

回答

0

我不認爲你有什麼是非常明智的做法。你應該有一個純粹的虛擬基礎類來描述你的實現實際上可以做什麼,然後你可以使用你需要的任何狀態來創建從基類繼承的具體類。然後,您將能夠通過您爲該基類定義的任何接口與狀態進行交互。現在,如果你有任意的動態屬性可以在運行時改變,那麼一個好的方法是使用地圖或字典類型;您可以將字符串(屬性名稱)映射到字符串(表示屬性值),或者如果您希望獲得更多類型安全性,則可以從字符串(屬性名稱)映射到boost::any的實例。

+0

但這是非常冗長的。我不想爲每個行爲創建一個類。 – 2010-04-30 11:03:15

4

我完全不理解你的情況,但這是我的注意事項:如果你改爲AbstractStatePolicy,會怎麼樣?例如:

class AbstractStatePolicy 
{ 
}; 

class Foo 
{ 
    AbstractStatePolicy *state_policy; 

public: 
    Foo(AbstractStatePolicy *state_policy) 
     : state_policy(state_policy) 
    { 
    } 
}; 

這種方式,而是採用了StatePolicy靜態定義Foo爲模板,你可以使用這樣的方法動態設置StatePolicy

如果您不喜歡在每次創建Foo時必須指定state_policy的想法,請考慮使用默認值或編寫工廠來實例化Foo s。

+0

打敗我吧。 +1 – Potatoswatter 2010-04-30 02:51:23

+0

+1就是這麼簡單。另外,你可以在那裏避免任意的多重繼承。 – wilhelmtell 2010-04-30 03:07:49

+0

我被告知是否必須使用多重繼承,重新考慮你的設計;)+1 – Robb 2010-04-30 03:30:36