委托模式(或OO设计原则)问题

时间:2011-06-24 14:38:22

标签: design-patterns

我对OOP中的委托设计原则有疑问。我将使用Window&来自GOF设计模式的Rectangle类示例解释了我的查询。

public class Window
{
    Rectangle myDelegate;

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

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

我的问题是:Rectangle(委托)是否可以引用窗口(父类)。即:

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;
    }
}

在非平凡的情况下,上面的代表可以更方便地更新父代的状态。 这是合乎逻辑的,还是我在这里遗漏了什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

维护单向引用要容易得多。在这种情况下,Window向矩形询问其自身的尺寸并使用它来分配所需的空间是合适的。然后Rectangle可以自由地在其空间中呈现自己。

答案 1 :(得分: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);
   }
}

答案 2 :(得分:0)

如果那些是我的类,并且我需要委托与父进行通信,我将在委托上创建一个事件并将父进程设置为侦听器。这有几个好处:

  • 它允许在多个父母之间共享同一个代理。如果委托表示有限资源(“端口1234”)或委托的实例化代价很高,这可能很有用。
  • 父母可以控制他们是否关心委托的行为。不在乎?不要注册对此事件的兴趣。
  • 维护考虑因素较少(正如Boris上面指出的那样)