2012-06-24 65 views
1

什麼是最適合的模式,可用於下面的方法。我傾向於開關語句的戰略模式,但是如果是這樣的話。另外,如果我將使用不同類型的折扣,我應該如何使用戰略模式?購物車中的付款策略

public void AddOrder(PaymentType paymentType, OrderType orderType) 
{ 
    if (orderType == OrderType.Sale) 
    { 
     switch (paymentType) 
     { 
      case PaymentType.Cash: 
       // Do cash calculations here 
       break; 
      case PaymentType.CreditCard: 
       // Do credit card calculations here 
       break;      
     } 
    } 
    else if (orderType == OrderType.Refund) 
    { 
     switch (paymentType) 
     { 
      case PaymentType.Cash: 
       // Do cash calculations here 
       break; 
      case PaymentType.CreditCard: 
       // Do credit card calculations here 
       break; 
      } 
     }    
    } 

感謝

+0

Stratergy模式在這種情況下是最好的模式,但你也可以使用裝飾模式也可以用適當的稅來裝飾產品 –

+0

謝謝Ajay。這裏的戰略模式將如何實施?我的意思是,我是否有策略模式來確定OrderType,然後在其中爲PaymentType提供另一個策略模式? – gnaungayan

回答

0

如果你看一下你的代碼,你基本上要的是有PaymentType處理2種訂單。因此,如果您使用兩種方法(銷售和退款)將PaymentType實現爲抽象類,那麼您就有了戰略模式的基礎。

然後,您將實現兩種具體的PaymentType(Cash和CreditCard),然後使用正在使用的付款類型配置合適的對象。

對於您的例子,我真的認爲該策略是過度殺傷。它也可能是錯誤的配合,因爲Strategy通常用於配置全局默認值。這裏看起來好像你希望能夠處理一堆事務,而不管它們的實際具體類型如何。

你可能好得多隻是用簡單的polymorphy與指揮這裏的模式,如結合...

public interface Transaction { 
    void perform(); 
} 

public interface PaymentType { 
    void sale(); 
    void refund(); 
} 

public class Sale implements Transaction { 
    private final PaymentType paymentType; 

    public Sale(final PaymentType paymentType) { 
    this.paymentType = paymentType; 
    } 

    public void perform() { 
    paymentType.sale(); 
    } 

} 


public class Refund implements Transaction { 
    private final PaymentType paymentType; 

    public Refund(final PaymentType paymentType) { 
    this.paymentType = paymentType; 
    } 

    public void perform() { 
    paymentType.refund(); 
    } 

} 

現在你可以這樣做:

public void AddOrder(final Transaction transaction) { 
    transaction.perform(); 
} 

您現在已經從分離AddOrder關於交易是銷售還是退款以及使用哪種付款的任何知識。這使得添加新類型的交易(layaway ...)和新的付款方式(debet card)變得很容易。