2017-03-09 191 views
2

我有一個C#程序,有一個名爲Ball類有兩個enum字段被稱爲BallColorBallType。有7種球顏色(紅色,藍色,黃色等)和7種球類型(網球,足球,保齡球等)。球對象可以具有顏色和類型的任何可能的組合。設計模式來處理不同類型的對象之間的交互

在我的程序中,我有許多Ball不同顏色和類型組合的對象。球可以通過碰撞相互作用。當兩個球碰撞時,它會觸發一個由名爲handleInteraction(ball1, ball2)的函數處理的交互。兩個球之間的相互作用取決於每個球的類型和顏色。例如,如果任何保齡球擊中任何乒乓球,乒乓球就會被破壞,保齡球會以其原始速度繼續移動。但是,如果足球與保齡球碰撞,足球會從保齡球中彈開,保齡球的速度減少n。另一個例子,如果一個紅色的網球與一個綠色的乒乓球相撞,乒乓球從網球上彈開,乒乓球的顏色變成與網球(紅色)相同的顏色。

在我的handleInteraction(ball1, ball2)函數中,我一直在處理使用嵌套的switch語句的交互。但是,當我編寫更多的代碼來處理所有情況時,嵌套的switch聲明似乎不是正確的方法。

任何人都可以想出更好的方法來處理球之間的相互作用嗎?

回答

2

一種解決方案是互動的結果和對球的創建界面:

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

感謝您的答案,特別是戰略模式的建議。 –

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 

我的做法是,所有的行爲

0

考慮抽象碰撞的概念,使性能。有關於速度,顏色等的規則將這些規則放在一張表中,然後只需查找並應用它們即可。

例如,如果有任何保齡球碰到乒乓球,乒乓球就會被破壞,保齡球會以其原始速度繼續移動。

碰撞後球會被破壞(或不會)。 (布爾值)

但是,如果任何一個英式足球與一個保齡球碰撞,那麼英式足球就會從保齡球中彈開,而保齡球的速度會減少n。

球的速度減少n。

球可以改變方向(「反彈」)。

另外一個例子,如果一個紅色的網球與一個綠色的乒乓球碰撞,乒乓球從網球上反彈而乒乓球的顏色變成與網球相同的顏色(紅)。

球可以改變顏色。

在這些例子中,規則有4個維度。如果您非常確定該模型,則可以輕鬆地編寫代碼來爲每次碰撞(在表格或地圖中)定義規則,並在沒有多少條件的情況下應用規則。