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

Design patterns 委托模式(或OO设计原则)问题,design-patterns,Design Patterns,我对OOP中的委托设计原则有一个疑问。我将使用GOF设计模式书中的窗口和矩形类示例来解释我的查询 public class Window { Rectangle myDelegate; public void Area() { return myDelegate.Area(); } } public class Rectangle { public int Area() { return 2*3; } }

我对OOP中的委托设计原则有一个疑问。我将使用GOF设计模式书中的窗口和矩形类示例来解释我的查询

public class Window
{
    Rectangle myDelegate;

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

public class Rectangle
{
    public int Area()
    {
        return 2*3;
    }
}
我的问题是:矩形(委托)是否可以引用窗口(父类)。i、 e:

在非常重要的情况下,上述操作将使委托更方便地更新父级的状态。 这是合乎逻辑的还是我遗漏了什么


谢谢

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

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

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); } } 公共接口IShape { 空隙面积(); 空位设置区域(内部区域); } 公共类窗口:IShape { 私有IShape矩形; 私人住宅区; 公共窗(IShape形状) { 矩形=形状; } 公共区域(内部区域) { myArea=面积; } 公众休憩用地() { 矩形区域(); } } 公共类矩形:IShape { 私人IShape窗口; 公共矩形(IShape形状) { 窗口=形状; } 公众休憩用地() { 设定面积(2*3); } 公共区域(内部区域) { 窗口设置区域(面积); } } 公共接口IShape { 空隙面积(); 空位设置区域(内部区域); } 公共类窗口:IShape { 私有IShape矩形; 私人住宅区; 公共窗(IShape形状) { 矩形=形状; } 公共区域(内部区域) { myArea=面积; } 公众休憩用地() { 矩形区域(); } } 公共类矩形:IShape { 私人IShape窗口; 公共矩形(IShape形状) { 窗口=形状; } 公众休憩用地() { 设定面积(2*3); } 公共区域(内部区域) { 窗口设置区域(面积); } }
如果这些是我的类,并且我需要委托与父级通信,我将在委托上创建一个事件,并将父级设置为侦听器。这有几个好处:

  • 它允许同一委托在多个父级之间共享。如果委托表示有限的资源(“端口1234”),或者如果委托的实例化成本很高,这可能很有用
  • 父级可以控制他们是否关心代理的行为。你不在乎吗?不要对这件事感兴趣
  • 更少的维护考虑(正如Boris在上文中指出的)

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

  • 它允许同一委托在多个父级之间共享。如果委托表示有限的资源(“端口1234”),或者如果委托的实例化成本很高,这可能很有用
  • 父级可以控制他们是否关心代理的行为。你不在乎吗?不要对这件事感兴趣
  • 更少的维护考虑(正如Boris在上文中指出的)

我对双向参考也不太满意。但是,在代理可能需要更新大部分父级状态的情况下,让父级引用代理听起来非常诱人。另外,像state模式这样的东西不是有双向引用吗?我对双向引用也不太满意。但是,在代理可能需要更新大部分父级状态的情况下,让父级引用代理听起来非常诱人。另外,像state模式这样的东西不是有双向引用吗?尽管这里建议的所有潜在解决方案都是有效的,但对于我的场景,这个解决方案看起来最适用。我相信zbugs的建议是,window和rectangle类共享一个公共接口,用于交换数据(甚至在需要时交换行为)。这种方法的缺点是窗口和矩形之间的紧密耦合。然而,在我的场景中,这是可以的,因为矩形类除了窗口类之外几乎没有任何客户机。所以我将把这个标记为答案。感谢大家花时间回答问题,尽管这里建议的所有潜在解决方案都是有效的,但在我的场景中,这个解决方案看起来最适用。我相信zbugs的建议是,window和rectangle类共享一个公共接口,用于交换数据(甚至在需要时交换行为)。这种方法的缺点是窗口和矩形之间的紧密耦合。然而,在我的场景中,这是可以的,因为矩形类除了窗口类之外几乎没有任何客户机。所以我将把这个标记为答案。谢谢大家花时间回答 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); } }