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

问题描述:

我有一个C#程序,有一个名为Ball类有两个enum字段被称为BallColorBallType。有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实施IBallswitch声明执行HandleInteraction后执行您的类。 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(); 
} 

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

+1

感谢您的答案,特别是战略模式的建议。 –

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

prop double Mass { get; set;) 

内handleInteraction

If(b1.Mass/b2.Mass < 0.1) // Make your Own ratios 
    //Destrioy Ball 
else if(..) 
    //Move in derecton or Bounce 

我的做法是,所有的行为

考虑抽象碰撞的概念,使性能。有关于速度,颜色等的规则将这些规则放在一张表中,然后只需查找并应用它们即可。

例如,如果有任何保龄球碰到乒乓球,乒乓球就会被破坏,保龄球会以其原始速度继续移动。

碰撞后球会被破坏(或不会)。 (布尔值)

但是,如果任何一个英式足球与一个保龄球碰撞,那么英式足球就会从保龄球中弹开,而保龄球的速度会减少n。

球的速度减少n。

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

另外一个例子,如果一个红色的网球与一个绿色的乒乓球碰撞,乒乓球从网球上反弹而乒乓球的颜色变成与网球相同的颜色(红)。

球可以改变颜色。

在这些例子中,规则有4个维度。如果您非常确定该模型,则可以轻松地编写代码来为每次碰撞(在表格或地图中)定义规则,并在没有多少条件的情况下应用规则。