Betalingsstrategie in winkelwagen

Wat is het meest geschikte patroon dat kan worden gebruikt voor de onderstaande methode. Ik neig naar een strategisch patroon voor de switch-statements, maar hoe zit het met de if's. Wat als ik verschillende soorten kortingen zou krijgen, zou ik dan ook het strategiepatroon moeten gebruiken?

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;
            }
        }            
    }

Bedankt

1
Bedankt Ajay. Hoe zou het strategiepatroon hier geïmplementeerd worden? Ik bedoel, heb ik een strategisch patroon voor het bepalen van OrderType en vervolgens een ander strategiepatroon voor PaymentType?
toegevoegd de auteur gnaungayan, de bron
Stratergy patroon is het beste patroon in deze situatie, maar u kunt ook het patroon van de decorateur gebruiken om producten te versieren met de juiste belastingen
toegevoegd de auteur Ajay Beniwal, de bron

1 antwoord

Als u naar uw code kijkt, wilt u in feite dat PaymentType twee soorten orders verwerkt. Dus als u PaymentType implementeert als een abstracte klasse met twee methoden - verkoop en terugbetaling - hebt u de basis voor een strategiepatroon.

U zou dan twee concrete soorten PaymentType (Cash en CreditCard) implementeren en vervolgens een geschikt object configureren met het soort betaling dat wordt gebruikt.

Voor uw voorbeeld denk ik echt dat Strategie overkill is. Het kan ook de verkeerde fit zijn, omdat Strategie meestal wordt gebruikt om een ​​globale standaard in te stellen. Hier lijkt het alsof u een aantal transacties wilt kunnen verwerken, ongeacht hun werkelijke concrete type.

Je bent waarschijnlijk veel beter af met het gebruik van eenvoudige polymorfie in combinatie met Command Pattern hier, zoals ...

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();
  }

}

Nu kunt u doen:

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

U hebt AddOrder nu ontkoppeld van de kennis of de transactie een verkoop of een terugbetaling is en welk type betaling wordt gebruikt. Dit maakt het gemakkelijk om een ​​nieuw soort transactie toe te voegen (layaway ...) en nieuwe betaalmethoden (debetkaart).

0
toegevoegd