ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-11 16:11:59  阅读:464  来源: 互联网

标签:software-design oop java c design-patterns


我有一个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有