封装行为的优雅方式取决于所涉及对象的组合?

时间:2018-02-27 18:28:35

标签: java design-patterns

想要检查两个物品是否在太空中碰撞。为此目的,两个项目都由一些简化的几何形状表示 - 为简单起见,我们假设这些形状只能是圆形,多边形和线条。物品可以由任何这些形状表示,并且碰撞检测需要能够处理任何可能的组合。我想找到一种涉及最少代码重复的策略,并允许将来添加更多形状。

我的方法如下:

        if (textBox6.Visible == true)
        {
            textBox6.Visible = false;
        } else {
            textBox6.Visible = true;
        }

    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {

    }


}

其中Collidable是任何几何形状的界面,可能的形状如下:

public class Item{

   private Collidable bounds;

   public boolean checkCollision(Item target){
       return bounds.checkCollision(target.getBounds());
   }
}

然而,这会产生大量的代码重复(相同的圆线碰撞算法需要在Line类中重复)并且似乎不是优雅。我在寻找解决方案时研究了不同的设计模式,但最终只得到了这种类似策略的解决方案。这里有什么更好的方法?

2 个答案:

答案 0 :(得分:1)

使用Visitor pattern恢复self._current_split类型的信息。 圆圈无法知道正在检查哪个图形的碰撞,但图中知道它。让我们通过double dispatching找到它。

您可以重命名这些方法,但其含义应保持不变。您还可以将这些方法标记为Collidable,以便不能在不同的上下文中调用它们。

您可以将检查特定对的方法委托给外部静态类,以避免代码重复。

internal

答案 1 :(得分:0)

也许您的碰撞检测不属于形状类。相反,您可以实现一组碰撞算法类,每个形状组合一个。然后代码只存在于一个地方。

您需要某种方法来选择正确的算法。您可以将它们保存在由形状名称键入的地图中,或者仅将相关的注入到每个形状中。

现在,当一个形状必须决定它是否与另一个形状碰撞时,它会找到正确的碰撞算法并要求答案。