2013-04-18 51 views
0

我的場景如下所示:針對消息對象設計的OOP建議

當您通過消息類型向不同目標發送消息時,我有一個消息系統。

這是我目前的設計:

Abstract class: MessageKindAbs 

MessageKind1 extends MessageKindAbs 
MessageKind2 extends MessageKindAbs 
MessageKind3 extends MessageKindAbs 

等..

現在MessageKind3是一種特殊的。它的目的是將MessageKind1MessageKind2的內容發送到日誌進程。

所以我裏面MessageKind3創建的MessageKind3Items列表:

list<MessageKind3Item> MessageKind3ItemList... 

MessageKind3Item包括MessageKind1/MessageKind2進行日誌記錄的信息。

所以基本上會發生什麼是每個MessageKind3Item還包括MessageKindAbs類型。

但這對我沒有意義。

例如:向DB隊列發送消息,並記錄MessageKind1持有的信息和MessageKind2持有的信息。

所以我的面向對象設計有點複雜。

任何人都可以幫我找到我的路嗎?

我可以在MessageKind3Item裏創建另一個實例類型MessageKindAbs但我不確定它是否有意義。

感謝, 射線,

回答

0

我可以在MessageKind3Item中創建另一個實例類型 MessageKindAbs,但我不確定它是否合理。

你不能,它是抽象的。


由於MessageKind3用於日誌記錄,所以它的結構是已知的。 因此,對於MessageKind3項目創建將喜歡的​​東西來實例化一個特殊LogItem類:

LogItem createLogItem(MessageKind1) { return new LogItem(); } 
LogItem createLogItem(MessageKind2) { return new LogItem(); } 

並附這些項目MessageKind3。

您試圖將所有類與繼承緊密耦合,這是問題所在。

+0

我的意思是引用類型不是實例。 2.我試圖使用面向對象爲了最小化緊密耦合。 – rayman

+0

對不起,我不確定你的意思。我的建議是把日誌項目放在一個日誌項目中,而不是不同類別的實例 - 這將減少組件耦合和相互之間的知識。 – Vitaly

+0

MessageKind3假設做更多的事情thens只是日誌記錄。 MessageKind1/MessageKind2的記錄只是一個例子。它可以例如將這些消息發送到電子郵件服務。我只是舉了一個例子。事情是,每個MessageKind對象應該被尋址到不同的目的地,而MessageKind3持有的MessageKind1和MessageKind2的信息 – rayman

3

我們可以發送到日誌進程的所有信息實現一個接口。例如:

public interface Logable { 

    void logTo(PrintWriter write); 
} 

MessageKind3只需要保持Logable名單。請注意,使用PrintWriter只是一個建議。您可能需要更詳細的參數類型,以便在接口實現中進行日誌記錄。然後

MessageKind3看起來就像這樣:

public class MessageKind3 extends MessageKindAbs { 

    private List<Logable> logables; 

    //... 

    public List<Logable> getLogables() { 
     return Collections.unmodifiableList(logables); 
    } 
} 

而且logables將包含MessageKind1MessageKind2情況下,因爲它們實現Logable

+0

那麼MessageKind3將如何在其中包含MessageKind1和MessageKind2的信息? – rayman

+0

@rayman我相應地擴展了我的答案。 – SpaceTrucker

+0

因此,如果我有更多的操作,如「電子郵件」或「監視器」,我會重複所有列表? – rayman