2013-03-13 15 views
6

Ich baue ein Flugbuchungssystem von einer Spezifikation für meine OOP Klasse in der Hochschule. Das System muss in C# geschrieben werden. Ich frage mich, was der beste Weg, um das folgende Problem anzugehen wäreBestes Entwurfsmuster für ein bedingtes Buchungssystem

Das Unternehmen betreibt derzeit ein Rabatt-Schema. Western Isles Bewohner erhalten einen Rabatt von 10%. Scotia erfasst auch die Insel des Wohnsitzes dieser Passagiere für Marketingzwecke. Business Reisende erhalten 25% Rabatt und müssen ihren Firmennamen angeben. Gewöhnliche Passagiere erhalten normalerweise keinen Rabatt, es sei denn, es ist Teil einer aktuellen Aktion. In diesem Fall erhalten sie einen 0% Rabatt auf 5% Rabatt auf .

Sollte ich eine Passagierklasse haben, von der jeder einzelne Kundentyp erbt? Jede mögliche Hilfe würde geschätzt werden

+0

Ich würde wahrscheinlich auch einen Dekorateur verwenden, wenn Passagiere mehrere Rabatte erhalten können, ist das der Fall? –

+0

Hallo Benjamin. Jeder Kunde kann nur einen der verfügbaren Rabatte erhalten. Vielen Dank. –

+0

Bedeutet Ihre Beschreibung, dass ein Passagier mehrere Rabatte erhalten kann? Wie 10% wegen des Aufenthalts * und * 25% für das Geschäft? Wenn ja, würde ich eine abgeleitete Klasse pro Rabatt nicht funktionieren. In einem realen Szenario würde ich einige einfache if-Statements in Betracht ziehen, da die Einführung eines vollwertigen Musters weit übertrieben erscheint. Wenn es sich jedoch um Hausaufgaben handelt und Sie angeben möchten, können Sie vielleicht eines finden, das besser zur Anforderung "viele Rabatte" passt. – nvoigt

Antwort

7

Meiner Meinung nach Sie nicht wollen von Passenger erben. Vererbung impliziert, dass sich das Objekt in irgendeiner Weise verändert, aber ein Passagier ist ein Passagier, egal welchen Rabatt er erhält. Anders gesagt, seine Funktionalität ändert sich nicht, nur weil er einen größeren Rabatt erhält.

Dieses Beispiel, das Sie verwenden, ist sehr nah an den Beispielen, die normalerweise für das Decorator Muster angegeben werden, obwohl dies normalerweise daran liegt, dass mehrere Rabatte auf das zu dekorierende Objekt angewendet werden können (Passenger in Ihrem Fall). Werfen Sie einen Blick auf dem Kaffee Beispiel auf dem Wiki here

Eine andere Möglichkeit Strategy Muster, das gibt Ihnen eine saubere Schnittstelle für ein Ticket für einen Passagier zu schaffen, während es intern die DiscountStrategy schaltet in Abhängigkeit davon, welche Art von Personen ein Ticket anfordert .

+0

+1 Bedenken der Fahrgastklasse sind orthogonal zur Rabattlogik –

+0

Danke Jamie, gute Antwort. Ich denke, ich werde mit dem Strategie-Muster fortfahren, wie es am passendsten erscheint. Was ist mit dem Gesicht, dass Geschäftskunden ihren Firmennamen aufgezeichnet haben müssen? Und West Isles Kunden brauchen ihre Insel des Wohnsitzes aufgezeichnet? Das ist, wo ich verwirrt bin. Danke noch einmal. –

+0

@DarrenFindlay - Aha, jetzt * das * könnte Ihnen einen Fall für die Vererbung geben. Der Passagier hat eindeutig zusätzliche Funktionalität (in diesem Fall neue Felder für die zusätzlichen Informationen). Als Nebeneffekt können Sie den Fahrgasttyp verwenden, um die richtige Rabattstrategie zu bestimmen. – Jamiec

-1

wenn es alles über Rabattschemas ist, kann es ausreichend sein, das Dekoratormuster zu verwenden, wie von anderen beschrieben.

Dann würden Sie den Typ der Schnittstelle und nicht des Passagiers überprüfen, wenn Sie z. Liste der Anzahl von Geschäftsreisenden oder Wohnort für Marketingzwecke usw.

0

Sie möchten Rabattpolitik flexibel machen, die Passagiere sind nicht wirklich so anders.

Sie könnten eine Customer Basisklasse haben, von der Passenger und Company abgeleitet werden, aber das beeinflusst nicht wirklich, wie Sie die Rabattlogik anwenden.

Vererbung bedeutet ein anderes Verhalten, aber das Verhalten der Passagiere ändert sich nicht, nur die angewandten Rabatte und Rabatte sollten nicht Teil des Passagierstatus sein, daher passt es nicht in diese Klasse. Darüber hinaus sind viele Rabatte nur für einen bestimmten Zeitraum aktiv und es ist nicht sinnvoll, diese in die Customer-Klasse zu codieren. Sie sollten sie dynamisch hinzufügen und entfernen können.

Da Rabattlogik tatsächlich eine Geschäftsregel ist, die beim Kunden angewendet wird, sollte sie in eine separate Gruppe von Klassen gekapselt werden. Übliches Muster, um dies zu implementieren, ist strategy. Je nachdem, wie Sie verschiedene Richtlinien für verschiedene Benutzer verwenden möchten, finden Sie möglicherweise visitor Muster nützlich oder nicht.

0

Ich würde ein Strategie-Muster verwenden, wie in früheren Beiträgen beschrieben "Eine weitere Möglichkeit ist das Strategie-Muster, das Ihnen eine saubere Schnittstelle für die Erstellung eines Tickets für einen Passagier bietet, während es intern die DiscountStrategy je nach Art des Passagiers umschaltet ein Ticket."