適切な設計パターンで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
に この例 によって割引が適用されている場合、CartItem
にDecorator pattern
を実装しました。ただし、この使用例の結果はまだ達成できません。
どういうわけか私はIpadとSmartCaseの両方がカートに入っていることを確認し、SmartCaseに割引を適用する必要がありますのみ。また、別のiPadを追加すると、別のSmartCaseを無料で入手できます。
基本的なサブクラス化以外にデザインパターンは必要ありません。必要なのはCouponインターフェースが1つのメソッドcalculateDiscount(cart、customer)のインターフェースだけです。割引の種類ごとにCouponの実装を作成します。 a FreeAddonCouponまたはa LoyaltyCoupon。
したがって、カートにはCartItemsとクーポンがあります。アイテムの価格を加算し、各クーポンの割引を差し引きます。
ここでは現実世界のプロセスが適しているようです。 Coupons
のコレクションをCart
オブジェクトにカプセル化することで、CartItems
(Checkout
コレクション)から分離します。
カート内のアイテムは、クーポンで変更されるまで標準価格になります。チェックアウト時に割引が適用され、無料アイテムも割引されます。チェックアウトプロセスは次のようになります。
CartItem
がカートから取り出され、CheckoutItem
になりますCheckoutItem
には追加のプロパティがあります-割引(最初は0)Coupon
は、CheckoutItem
コレクションでピークになり、そこにあるものに基づいています:price > 0
はカスケード効果を避けるために十分です)CheckoutItems
プロパティがユーザーに提示され、最終的に注文が作成されます。Ps。クーポンの前に(カートにアイテムを追加する前に)値が表示される場合、Checkout
は正しい名前ではない可能性がありますが、プロセスでimoを変更しないでください。