2009-12-31 168 views
0

我一直在思考實現某種功能的最佳方式......即派生出的對象使用相同的基礎(包括相互引用)來引用其他派生對象。建議設計模式?

下面是最好的(簡單)的例子,我能想到的來說明這樣的問題:房子由3個房間(但實際上它可能是數百個)按照各自的派生類表示。當然,它不會像現在這樣工作,它會導致堆棧溢出(適當的!)

假設示例中的每個房間都是特定於虛構房屋中的房間的,應該不超過一個任何子類。構建大量的實例,即使沒有遞歸,也會很麻煩。這會讓我覺得單身人士如果這不是一個禁忌......任何人都可以提出一些更合適的建議嗎?

謝謝!

public abstract class Room 
{ 
    abstract public void DoAction(); 
    public Room[] ConnectedRooms; 
} 

public class Kitchen : Room 
{ 
    public Kitchen() { ConnectedRooms = new Room[] { new Hall() }; } 
    public override void DoAction() { MakeTea(); } 
} 

public class Bedroom : Room 
{ 
    public Bedroom() { ConnectedRooms = new Room[] { new Hall() }; } 
    public override void DoAction() { Sleep(); } 
} 

public class Hall : Room 
{ 
    public Hall() { ConnectedRooms = new Room[] { new Hall(), new Bedroom() }; } 
    public override void DoAction() { LookOutWindow(); } 
} 
+0

我不會在這裏推薦singleton來強制執行單實例要求。如果不知道你在做什麼,就很難推薦任何東西。 有時最好的設計模式是沒有設計模式。更好地瞭解何時不使用模式而不是使用哪種模式。 – 2009-12-31 19:03:41

+0

霍爾構造函數是否應該將連通房間設置爲另一個大廳或廚房? – 2010-01-01 02:54:22

回答

4

你的房間應該包含引用到彼此房間的情況 - 沒有新的實例。

例如創建一個新的Kitchen,Hall,Bedroom。然後通過Hall的參考Bedroom,到Kitchen等你有你的三個對象通過這種方式,他們有在隔壁房間的引用。

Kitchen k = new Kitchen(); 
Bedroom b = new Bedroom(); 
k.addNeighbour(b); 

(我通常構建適當引用一個Kitchen,但你似乎有循環引用,所以這不是那麼容易)

如果你真的只需要每個的一個實例,然後檢查出singleton pattern。但是,除非嚴格必要,否則我不會強制執行該操作畢竟,很多房子有不止一間臥室!

+0

我的想法。我不認爲單身人士在這裏是完全適合的,因爲你可能會想要多個房間類型的多個實例......即使你沒有,也會增加不需要的複雜度。 – 2009-12-31 19:03:08

+0

這個想法是正確的,一次創建所有房間並持有連接的參考,而不是多次創建每個房間。 – 2009-12-31 19:05:05

+0

謝謝,這很有趣,雖然它需要將連接定義從類定義中移開...我認爲它有優點和缺點。在類定義中,很容易找到類的連接定義在哪裏。然而,將所有連接定義在一個地方也是有好處的。 – Bobbins 2009-12-31 23:28:53

0

所有你需要做的是避免實例的另一個構造函數中的一個房間。你需要實例化你的所有房間(Kitchen k = new Kitchen(); Hall h = new Hall();),然後添加連接(k.ConnectedRooms [0] = h; h.ConnectedRooms [0] = k;)。或者,要巧,創建一個相互連接它們的方法:

public abstract class Room 
{ 
public void Connect(Room r) 
{ 
this.ConnectedRooms.Add(r); 
r.ConnectedRooms.Add(this); 
} 
} 

假設你改變你的連接數組列表,這可能是一個好主意。

2

你真的需要進一步封裝(這是正確的字?)你的模型。

public class House 
{ 
    private readonly Hall hall = new Hall(); 
    private readonly Kitchen kitchen = new Kitchen(); 

    // etc 

    public House() 
    { 
     hall.AddAdjacentRoom(kitchen); 
     // etc 
    } 

} 
+0

很好地說,一個房子類會真的把房間綁在一起。 – Bobbins 2010-01-01 00:10:31