gpt4 book ai didi

java - 封装依赖于所涉及对象组合的行为的优雅方式?

转载 作者:行者123 更新时间:2023-11-30 10:18:52 25 4
gpt4 key购买 nike

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

我的方法如下:

public class Item{

private Collidable bounds;

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

其中 Collidable 是任何几何形状的接口(interface),可能的形状如下所示:

public class Circle implements Collidable{

public boolean checkCollision(Collidable target){
if(target instanceof Cirlce){
//Algorithm for circle-circle collision
}else if(target instanceof Line){
//Algorithm for circle-line collision
//...
}else{
return false;
}
}
}

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

最佳答案

使用 Visitor pattern恢复 Collidable 类型的信息。圆圈不知道正在检查哪个图形是否发生碰撞,但图形知道。让我们通过double dispatching找出来.

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

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

public interface Collidable {
boolean checkCollision(Collidable target);
boolean visit(Collidable collidable);
boolean accept(Circle circle);
boolean accept(Line line);
}

public static class CollisionChecks {
public static boolean check(Circle a, Circle b) { return false; }
public static boolean check(Circle a, Line b) { return false; }
public static boolean check(Line a, Line b) { return false; }
}

public class Line implements Collidable {
@Override
public boolean checkCollision(Collidable target) {
return target.visit(this);
}

@Override
public boolean visit(Collidable collidable) {
return collidable.accept(this);
}

@Override
public boolean accept(Circle circle) {
return CollisionChecks.check(circle, this);
}

@Override
public boolean accept(Line line) {
return CollisionChecks.check(this, line);
}

}

public class Circle implements Collidable {
@Override
public boolean checkCollision(Collidable target) {
return target.visit(this);
}

@Override
public boolean visit(Collidable collidable) {
return collidable.accept(this);
}

@Override
public boolean accept(Circle circle) {
return CollisionChecks.check(this, circle);
}

@Override
public boolean accept(Line line) {
return CollisionChecks.check(this, line);
}
}

关于java - 封装依赖于所涉及对象组合的行为的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49015557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com