Ich versuche, ein System zu implementieren, das mehrere Rabatte auf meinen Einkaufswagen / abgeschlossene Bestellungen anwenden kann. Ich habe ein Strategietypmuster angewendet, um die Verarbeitung der Rabatte innerhalb der Rabatte zu kapseln.
Ich habe folgendes herausgefunden: eine abstrakte Rabatt-Basisklasse mit Unterklassen, die die konkreten Rabatte ausmachen. Diese werden dann entweder auf ein Bestell- / Einkaufswagenobjekt angewendet und verarbeiten den Inhalt des Bestell- / Einkaufswagens, wenn sie dem Einkaufswagen / Bestellung hinzugefügt werden.
Ich würde gerne einige Kommentare zum beigefügten Code hören. Verschiedene geschützte Konstruktoren und Mitglieder, die mit "virtual" markiert sind, werden für Nhibernate benötigt.
Chev
%Vor%}
Wie ich in den Kommentaren zu Ihrer Frage erwähnt habe, glaube ich nicht, dass Strategie in diesem Fall geeignet ist.
Für mich sind all diese Rabatte BuyXGetYFree, SpendMoreThanXGetYDiscount usw. alle Regeln (und müssen nicht unbedingt nur einen Rabatt erhalten), die bei der Berechnung der Produkt- / Warenkorbkosten angewendet werden können. Ich würde eine RulesEngine mit den Regeln erstellen, die du umrissen hast, und wenn du den Wagen anforderst, seine Kosten zu berechnen, prozessiere es gegen die RulesEngine. Die RulesEngine würde die Produktlinien bearbeiten, aus denen der Einkaufswagen und die Gesamtbestellung bestehen, und die entsprechenden Anpassungen der Kosten usw. vornehmen.
Die RulesEngine könnte sogar die Reihenfolge steuern, in der die Regeln angewendet werden.
Regeln können produktbasiert sein (z. B. Buy one get one free) oder auftragsbasiert (z. B. Buy X-Artikel erhalten kostenlosen Versand) und Sie könnten sogar Ablauftermine eingebaut haben. Diese Regeln würden in einem Datenspeicher beibehalten / p>
Für mich scheint das Dekorationsmuster hier besser anwendbar zu sein. Es beginnt mit einer ähnlichen Rabattklassenhierarchie, die Sie haben, aber die Rabatte würden auch OrderBase
implementieren. Dann schmücken sie die Bestellung, anstatt nur an sie gebunden zu sein. Bei der Abfrage erhält der Dekorator die Bestelldaten von der Bestellinstanz, die er dekoriert (was eine einfache Bestellung oder ein anderer Dekorateur sein kann) und wendet darauf den entsprechenden Rabatt an. IMO das ist ziemlich einfach zu implementieren, aber auch flexibel genug; Kurz gesagt, für mich ist dies die einfachste Lösung, die funktionieren kann.
Die Reihenfolge der Rabatte in der Dekorationskette ist wahrscheinlich nicht beliebig; Auf den ersten Blick sollten Sie zuerst die preisverändernden Rabatte und dann die Mengen ändern. Aber ich denke, das ist keine sehr starke Einschränkung.
Tags und Links c# design-patterns architecture e-commerce