gpt4 book ai didi

java - 处理不同类型对象之间交互的设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:52 27 4
gpt4 key购买 nike

我有一个 C# 程序,它有一个名为 Ball 的类,它有两个 enum 字段,分别称为 BallColorBallType。有 7 种球颜色(红色、蓝色、黄色等)和 7 种球类型(网球、足球、保龄球等)。球对象可以具有任何可能的颜色和类型组合。

在我的程序中,我有许多不同颜色和类型组合的 Ball 对象。球可以通过碰撞相互影响。当两个球发生碰撞时,会触发由名为 handleInteraction(ball1, ball2) 的函数处理的交互。两个球之间的相互作用取决于每个球的类型和颜色。例如,如果任何保龄球击中任何乒乓球,乒乓球就会被摧毁,保龄球会继续以原来的速度运动。但是,如果任何足球与保龄球发生碰撞,足球就会从保龄球上弹开,保龄球的速度将降低 n。另一个例子,如果一个红色的网球与一个绿色的乒乓球相撞,乒乓球从网球上弹开,乒乓球的颜色变成与网球相同的颜色(红色)。

在我的 handleInteraction(ball1, ball2) 函数中,我一直在使用嵌套的 switch 语句处理交互。然而,随着我编写更多代码来处理所有情况,嵌套的 switch 语句似乎并不是正确的方法。

谁能想出更好的方法来处理球之间的相互作用?

最佳答案

一种解决方案是为交互结果和球创建接口(interface):

public interface IInteractionResult
{
void Handle();
}

public interface IBall
{
BallTypeEnum BallType { get; }

IInteractionResult HandleInteraction(IBall ball);
}

并实现每个可能实现 IInteractionResult 的类,其中在 Handle 方法中提供交互逻辑:

public class DestroyInteractionResult : IInteractionResult
{

public void Handle()
{
//your code for destroy result behaviour
}
}

public class BounceInteractionResult : IInteractionResult
{

public void Handle()
{
//your code for bounce result behaviour
}
}

public class NothingInteractionResult : IInteractionResult
{

public void Handle()
{
//your code for nothing
}
}

在此之后实现您的 Ball 类,它将在实现 HandleInteraction 时使用 switch 语句实现 IBallSoccerBall 例如:

public class SoccerBall : IBall
{
public BallTypeEnum BallType
{
get { return BallTypeEnum.Soccer; }
}

public IInteractionResult HandleInteraction(IBall ball)
{
switch (ball.BallType)
{
case BallTypeEnum.Soccer:
return new BounceInteractionResult();
case BallTypeEnum.Bowl:
return new DestroyInteractionResult();
case BallTypeEnum.PingPong:
return new BounceInteractionResult();
// and so on
}

throw new NotImplementedException("Undefined ball type");
}
}

为每个球类型和每个交互单独的类有助于您将每个类型的单一逻辑收集到单个类中。

而你的handleInteraction 看起来像:

public void handleInteraction(IBall ball1, IBall ball2)
{
var interaction = ball1.HandleInteraction(ball2);

interaction.Handle();
}

在我看来,这是最灵活的解决方案。某种策略模式。

关于java - 处理不同类型对象之间交互的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687416/

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