2012-06-24 3 views
1

Какая наиболее подходящая модель, которая может быть использована для метода ниже. Я склоняюсь к шаблону стратегии для операторов switch, но как насчет if. Также, если у меня будут разные скидки, следует ли использовать шаблон стратегии?Стратегия платежей в корзине

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 pattern - лучший образец в этой ситуации, но вы также можете использовать узор декоратора и украсить продукт соответствующими налогами –

+0

Спасибо Ajay. Как будет реализована стратегия? Я имею в виду, будет ли у меня шаблон стратегии для определения OrderType, а затем внутри него другой шаблон стратегии для PaymentType? – gnaungayan

ответ

0

Если вы посмотрите на ваш код, что вы в основном хотят, чтобы иметь PaymentType обрабатывать два вида заказов. Поэтому, если вы реализуете PaymentType как абстрактный класс с двумя методами - продажами и возмещениями - у вас есть основа для шаблона стратегии.

Затем вы должны реализовать два конкретных вида PaymentType (Cash and CreditCard), а затем настроить подходящий объект с использованием способа оплаты.

Для вашего примера я действительно считаю, что стратегия переборщила. Он также может быть неправильным, поскольку стратегия обычно используется для настройки глобального значения по умолчанию. Здесь, похоже, вы хотите иметь возможность обрабатывать кучу транзакций независимо от их конкретного конкретного типа.

Вы, вероятно, гораздо лучше просто использовать простой 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 ...) и новых способов оплаты (дебетовая карта).