web-dev-qa-db-ja.com

ショッピングカートに「buy one get one for free」クーポンロジックを実装する

適切な設計パターンでbogo couponロジックを解決しようとしていますが、1つを特定できません。
使用例:「購入iPadgetSmartCase無料」

次のオブジェクトがあるとします。

Product:
 - getPrice

CartItem(Product p, quantity):
 - getPrice

Cart:
 - getItems()
 - addItem(CartItem ci)

Coupon(code):
 - getCode

CouponBuyOneGetOneFree(code) extends Coupon: (not sure about inheritance here)

1)ここに適合するデザインパターンは何ですか?
2)クーポンなしで、製品設定自体で同じロジックをセットアップする必要がある場合はどうなりますか?

sameCartItemこの例 によって割引が適用されている場合、CartItemDecorator patternを実装しました。ただし、この使用例の結果はまだ達成できません。

どういうわけか私はIpadSmartCaseの両方がカートに入っていることを確認し、SmartCaseに割引を適用する必要がありますのみ。また、別のiPadを追加すると、別のSmartCaseを無料で入手できます。

3
Putna

基本的なサブクラス化以外にデザインパターンは必要ありません。必要なのはCouponインターフェースが1つのメソッドcalculateDiscount(cart、customer)のインターフェースだけです。割引の種類ごとにCouponの実装を作成します。 a FreeAddonCouponまたはa LoyaltyCoupon

したがって、カートにはCartItemsとクーポンがあります。アイテムの価格を加算し、各クーポンの割引を差し引きます。

4
kevin cline

ここでは現実世界のプロセスが適しているようです。 CouponsのコレクションをCartオブジェクトにカプセル化することで、CartItemsCheckoutコレクション)から分離します。

カート内のアイテムは、クーポンで変更されるまで標準価格になります。チェックアウト時に割引が適用され、無料アイテムも割引されます。チェックアウトプロセスは次のようになります。

  1. CartItemがカートから取り出され、CheckoutItemになります
  2. CheckoutItemには追加のプロパティがあります-割引(最初は0)
  3. Couponは、CheckoutItemコレクションでピークになり、そこにあるものに基づいています:
    • 単一アイテムの割引を増やし、
    • 「無料」アイテムを追加
    • 負の価格の「メタアイテム」を追加します(合計/小計割引)
  4. 追加のアイテムは後続のクーポン(price > 0はカスケード効果を避けるために十分です)
  5. チェックアウト時に何かを変更したクーポンはユーザーから取り除かれます
  6. すべてのクーポンを反復した後、CheckoutItemsプロパティがユーザーに提示され、最終的に注文が作成されます。

Ps。クーポンの前に(カートにアイテムを追加する前に)値が表示される場合、Checkoutは正しい名前ではない可能性がありますが、プロセスでimoを変更しないでください。

2
shudder