2011-06-24 39 views
1

我有一個關於OOP委託設計原則的查詢。我將使用GOF設計模式書中的窗口& Rectangle類示例來解釋我的查詢。委託模式(或OO設計原則)問題

public class Window 
{ 
    Rectangle myDelegate; 

    public void Area() 
    { 
     return myDelegate.Area(); 
    } 
} 

public class Rectangle 
{ 
    public int Area() 
    { 
     return 2*3; 
    } 
} 

我的問題是:矩形(委託)可以引用窗口(父類)。即:

public class Window 
{ 
    Rectangle myDelegate; 
    public int myArea; 

    public void Area() 
    { 
     myDelegate.Area(); 
    } 
} 

public class Rectangle 
{ 
    Window myParent; 

    public void Area() 
    { 
     myParent.myArea = 2 * 3; 
    } 
} 

在非平凡的情況下,上面的代碼可以更方便地更新父代的狀態。 這是合乎邏輯還是我在這裏錯過了一些東西?

謝謝!

回答

0
 
public interface IShape 
{ 
    void Area(); 
    void SetArea(int area); 
} 

public class Window : IShape 
{ 
    private IShape rectangle; 
    private int myArea; 

    public Window(IShape shape) 
    { 
     rectangle = shape; 
    } 

    public void SetArea(int area) 
    { 
     myArea = area; 
    } 
    public void Area() 
    { 
     rectangle.Area(); 
    } 
} 

public class Rectangle : IShape 
{ 
    private IShape window; 

    public Rectangle(IShape shape) 
    { 
     window = shape; 
    } 

    public void Area() 
    { 
     SetArea(2 * 3); 
    } 

    public void SetArea(int area) 
    { 
     window.SetArea(area); 
    } 
} 

+0

儘管這裏提出的所有潛在解決方案都是有效的,但對於我的方案而言,此解決方案看起來最適用。我相信zbugs所暗示的是窗口和矩形類共享一個共同的接口,它們用來交換數據(甚至是需要時的行爲)。這種方法的缺點是窗口和矩形之間的緊密耦合。然而,在我的情況下,這是可以的,因爲矩形類除了Window類之外幾乎沒有任何客戶端。所以我會將其標記爲答案。 感謝其他人花時間回答 – rhk98

1

維護單向引用更容易。在這種情況下,Window可以問自己尺寸的矩形並用它來分配所需的空間。然後,Rectangle將有自由按照自己的意願呈現其空間。

+0

我也是不太舒服關於雙向參考。然而,在委託人可能需要更新父母的大部分狀態的情況下,讓父母對委託人的引用聽起來很誘人。也不像狀態模式有雙向引用? – rhk98

0

如果那些是我的課,我需要委託溝通回父,我將創建委託的事件,並設置父了作爲一個傾聽者。這有幾個好處:

  • 它允許相同的委託在多個父母之間共享。如果委託代表有限的資源(「端口1234」)或實例化委託代價昂貴,這可能很有用。
  • 家長可以控制他們是否關心委託人的行爲。不關心?不要在活動中註冊興趣。
  • 更少的維護注意事項(如上面鮑里斯指出的)