我正在研究串行數據協議的解析器。我有一個總體Packet
類,一對夫婦的子類,如CommandPacket
和StatusPacket
,然後每個那些幾個子類:TypeOf Subclass的設計模式
- 包
-
- CommandPacket
-
-
- CommandTypeA
-
-
-
- CommandTypeB
-
-
- 狀態分組
-
-
- StatusTypeA
-
-
-
- StatusTypeB
-
的Packet
類有用於取數據從一個緩衝器的靜態方法,且如果它表示一個有效的數據包,返回一個新的類實例,用必要的數據實例化。
現在,這是我的問題出現的地方。我希望能夠返回最具體的類型的數據包。爲了促進這一點,我創建了一個靜態的.isValid()
方法,該方法在子類上被覆蓋。我的想法是,我可以遍歷每種類型的特定數據包(CommandTypeA
,CommandTypeB
,StatusTypeA
,StatusTypeB
等),調用.isValid()
,直到其中一個返回TRUE
。那時,我會返回一個特定數據包類型的新實例。
當然,我可以直接創建這個方法,我該如何解釋未添加到我的項目中的數據包類型?我希望有人能夠在未來擴展我的班級,而無需修改原始的Packet
班級。
我已經考慮過利用反射來實現這個功能,但是我避免了這種情況,因爲這些方法會被調用來接收每個數據包,並且必須高效。
有關如何重新設計我的設計模式的任何想法?
雖然我不認爲這是完全relelvant的討論,我在VB.NET這樣做。還有一個類似的(但不完全相同)的問題發佈在這裏:Java - subclass validation design pattern
如何:創建驗證程序的註冊表,例如'class ValidatorsRegistry:Dictionary> {}'然後註冊每種類型的驗證器。 'validatorsMap.Add(typeof(CommandPacket),IsValidCommandPacket);',並循環你已經做的。 –
AVIDeveloper
2012-03-04 22:17:25
@AVIDeveloper,感謝您的建議。我可以在什麼時候將這些類型添加到此字典中?理想情況下,它將在類自身內,但它們不會被實例化。我想我應該創建這個時候我的基類被加載? – Brad 2012-03-04 22:19:59
這就是C++靜態c'tors會很方便的地方。但是,無論如何,您需要在組件的一些常見Init()方法中註冊它們。也許有更好的辦法,但是在這個夜晚的時候就會想到這一點。 – AVIDeveloper 2012-03-04 22:27:06