编程语言
首页 > 编程语言> > java-处理不同类型的对象之间的交互的设计模式

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

作者:互联网

我有一个C#程序,该程序具有一个名为Ball的类,该类具有两个名为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.例如SoccerBall:

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

我认为这是最灵活的解决方案.某种策略模式.

标签:software-design,oop,java,c,design-patterns
来源: https://codeday.me/bug/20191111/2021182.html