2016-08-26 3 views
1

Ich bin der Umsetzung der Strategie Muster:Java, Strategy-Muster, Generics und Rückgabetyp

public interface Stuff<T> { 
    T getStuff(); 
} 

public class IntegerStuff implements Stuff<Integer> { 
    public Integer getStuff() { .. } 
} 

public class StringStuff implements Stuff<String> { 
    public String getStuff() { .. } 
} 

Nun, ich möchte einen "Kontext" verwenden, um die Strategie zu setzen und die Strategie Methode ausführen:

public class Context() { 
    private Stuff stuff; 
    public setStrategy(Stuff stuff) { this.stuff = stuff; } 

    public Object doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 

Wie kann ich generische verwenden, so dass der Typ der doStuff()-Methode für die Context-Klasse vom gleichen Typ wie die verwendete Strategie sein kann?

+1

Die Strategie Muster ermöglicht eine Art Blackbox Verhalten. Sie haben eine definierte Eingabe und eine definierte Ausgabe, aber was dazwischen passiert, entscheidet über die Strategie (die austauschbar sein sollte). Wie Sie die Ausgabe Ihrer Methode ändern möchten, denke ich, dass Strategie-Muster hier nicht die richtige Wahl ist – CRC

+0

@CRC, yeah, ich denke, Sie haben Recht, ändern Rückgabetyp ändert den "Vertrag" – Luciano

+1

Vielleicht kann dies auf eine andere Weise gelöst werden : Was versuchst du damit zu machen? – Fildor

Antwort

3

Sie würden wollen Context parametrieren auch:

public class Context<T> { 
    private Stuff<T> stuff; 
    public setStrategy(Stuff<T> stuff) { this.stuff = stuff; } 

    public T doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 
+0

In diesem Fall (Strategie-Muster) funktioniert dies nicht. Ich möchte nicht einen Kontext mit dem Typ der Strategieklasse erstellen müssen! 'Kontext c = neuer Kontext <>();' – Luciano

+0

@Luciano: Was bedeutet "das funktioniert nicht"? Warum funktioniert es nicht? –

+0

In diesem Fall kennen Sie Ihren Ausgabetyp nicht. Sie können also nur sicher sein, dass der zurückgegebene Wert ein Objekt ist, aber nichts anderes. Daher können Sie entscheiden, ob Sie Ihre Ausgabe einschränken oder Object als Rückgabetyp verwenden möchten. – CRC