Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理不同类型对象之间交互的设计模式_Java_C#_Oop_Design Patterns_Software Design - Fatal编程技术网

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

Java 处理不同类型对象之间交互的设计模式,java,c#,oop,design-patterns,software-design,Java,C#,Oop,Design Patterns,Software Design,我有一个C#程序,它有一个名为Ball的类,它有两个enum字段,分别名为BallColor和BallType。有7种球颜色(红色、蓝色、黄色等)和7种球类型(网球、足球、保龄球等)。球对象可以具有颜色和类型的任意可能组合 在我的程序中,我有许多不同颜色和类型组合的Ball对象。球可以通过碰撞相互作用。当两个球碰撞时,它会触发一个由名为handleInteraction(ball1,ball2)的函数处理的交互。两个球之间的相互作用取决于每个球的类型和颜色。例如,如果任何保龄球击中任何乒乓球,乒

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

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

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


有人能想出更好的方法来处理球之间的交互吗?

一个解决方案是为交互结果和球创建接口:

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
语句实现
IBall
<代码>足球例如:

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

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

更好的方法是在Ball类中增加一些属性,如下所示。更像是真实的物理

prop double Mass { get; set;)
手内互动

If(b1.Mass / b2.Mass < 0.1) // Make your Own ratios
    //Destrioy Ball
else if(..)
    //Move in derecton or Bounce
If(b1.Mass/b2.Mass<0.1)//制作您自己的比率
//破坏球
否则如果(…)
//直接移动或反弹

我的方法是,为所有行为创建属性

考虑抽象冲突的概念。有一个关于速度、颜色等的规则。把这些规则放在一个表中,然后进行查找并应用它们

例如,如果任何保龄球击中任何乒乓球,乒乓球将被摧毁,保龄球将继续以其原始速度移动

一个球在碰撞后可能会被摧毁(或者不会)。(布尔值)

但是,如果任何足球与保龄球碰撞,足球会从保龄球上反弹,保龄球的速度会降低n

球的速度减少n

球可以改变方向(“从球上反弹”)

另一个例子是,如果一个红色的网球与一个绿色的乒乓球碰撞,乒乓球会从网球上反弹,乒乓球的颜色将更改为与网球相同的颜色(红色)

球可以改变颜色


在这些示例中,规则有4个维度。如果您对该模型非常确信,您可以轻松地编写一些代码来定义每次冲突的规则(在表或映射中),并在没有很多条件的情况下应用这些规则。

感谢您的回答,特别是策略模式的建议。