2016-05-16 6 views
1

Ich möchte das Open-Close-Prinzip auf dieses folgende Beispiel anwenden, indem ich diesen Code neu schreibe.Open-Close-Prinzip Beispiel

class MyQueue<E> extends ArrayList<E> implements Queue<E> { 
    int front=0, back=0; 
    MyQueue() { } 
    … 
    void put(E e) { add(back++, e); ...} 
    E get() { E elem = get(front++); …} 
} 

Welches Entwurfsmuster würde der Lösung am nächsten kommen und warum? Erklären Sie, warum es besser ist als das nächstbeste Spiel.

Ich habe Probleme zu denken, welche Funktionen diese Klasse erweitern würde. Es hat bereits den Getter und Setter. Ohne zu wissen, welche Art von Erweiterungen angewendet werden kann, bin ich mir nicht sicher, wie ich diesen Code umschreiben soll.

Was ich weiß: OCP ist offen für Erweiterung-geschlossen, um zu ändern. Daher besteht ein allgemeiner Ansatz darin, herauszufinden, wie man es abstrahieren kann. Mein erster Gedanke war, dies zu einer abstrakten Klasse mit abstrakten Methoden zu machen. Dann würde jede Klasse, die MyQueue() erweitern würde, in der Lage sein, die Getter- und Setter-Methoden zu implementieren, wie sie es auch wollten. Und wenn ich das tue, dann würde ich annehmen, dass dies genau dem Adaptermuster entspricht.

Bitte korrigieren Sie Missverständnisse, die ich mit meinem Verständnis habe.

+1

Ich verstehe nicht, warum das abgelehnt wird ... Ich folgte den Richtlinien, eine Frage zu stellen. Kann jemand klären? Es hilft nicht, einfach abgelehnt zu werden, ohne zu wissen warum. –

+2

Am wahrscheinlichsten wurde es für das Ausschauen wie Hausaufgaben und fordernde Meinungen herabgestuft. – Andreas

+1

Frage ist ganz nett. Vielleicht in der Nähe von Hausaufgaben, aber immer noch eher ein Verständnis von 'OCP' in der Praxis. Das ist nicht immer offensichtlich. – RMachnik

Antwort

1

Aus meiner Sicht ist dies ein Beispiel für die Erstellung Queue basierend auf ArrayList Implementierung. Zuerst werde ich versuchen, nur Queue Interface-Methode zu belichten. Alle Methoden, die von ArrayList übernommen werden, sollten irgendwie versteckt werden.

Die Sache ist, wir wissen, dass Sie in Java die öffentliche Methode während der Vererbung nicht verstecken können. Dann können Sie nur angehen, um sie zu überschreiben und UnsupportedOperationException oder etw so zu werfen.

Sie müssen sicherstellen, dass Sie Queue Schnittstelle basierend auf ArrayList innen korrekt implementieren. Sie sollten korrekt implementieren add, offer, remove, pool, element, peek. Andere Methoden, die von ArrayList stammen, sollten eine Ausnahme auslösen.

Das ist meine Meinung zu diesem Thema.

+0

Also, um zu verdeutlichen, suggerieren Sie, dass ich diese "MyQueue()" -Klasse als eine Schnittstelle mache, indem ich alle Funktionen von ArrayList hinzufüge, wie hinzufügen, anbieten, entfernen usw., dann kann jede konkrete Klasse ihre eigenen Versionen implementieren diese Getters/Setter/etc. Richtig? –

+0

In welchem ​​Fall kann ich annehmen, dass es dem Adaptermuster folgt? –

+1

Beantworten des ersten Kommentars. Ich schlage vor, die MyQueue-Klasse als Warteschlange zu betrachten. Zweite Kommentarantwort: Mehr oder weniger ist es Adapter. Sie versuchen, 'ArrayList' an' Queue' anzupassen. Was ich dort zeigen wollte, ist bitte, benutze 'ArrayList' als Mechanismus für deine' Queue'. Zurück zur Verwendung sollten Sie 'MyQueue'-Instanz der' Queue'-Schnittstelle zuweisen. Wie: 'Warteschlange yourQueue = new MyQueue()'. – RMachnik