2016-10-11 2 views
3

Ich versuche, das Designmuster Strategie in Java zu verwenden. Also, ich habe eine abstrakte Klasse namens Nenuphare, die einige Schnittstellen verwenden (Mort, AlterationEtat und ModifPV) und ich muss 5 Arten von Nenuphare erstellen. Wenn ich recht habe, muss ich Nenuphare als abstrakte Klasse behalten, will ich im Designmuster Strategie bleiben. Der einfachste Weg wäre, eine Klasse zu erstellen, die Nenuphare implementiert und für jede Klasse Mort, AlterationEtat und ModifPV ändert. Aber ich muss das mit einem enum tun. Leider kann enum eine Klasse nicht erweitern, da sie den enum-Typ bereits erweitert.Erweitert eine abstrakte Klasse zu einem Enum - Strategie Pattern

Hier ist mein Code für Nenuphare:

public abstract class Nenuphare { 
    public int etatVieillissement = 3; 
    protected String nom = "Eau"; 

    protected Mort mort = new MortSubite(); 
    protected AlterationEtat altetat = new NoAlteration(); 
    protected ModifPV pv = new NoModifPV(); 

    public Nenuphare(){} 

    public Nenuphare(Mort mort, AlterationEtat altetat, ModifPV pv){ 
     this.mort = mort; 
     this.altetat = altetat; 
     this.pv = pv; 
    } 

    public void death(){ 
     mort.mort(); 
    } 

    public void alteration(){ 
     altetat.altEtat(); 
    } 

    public void modificationPV(){ 
     pv.modifPV(); 
    } 
} 

Ich versuchte, meine 5 Art von Nenuphare auf diese Weise zu erstellen:

public enum TypeNenuphare extends Nenuphare { 
    type1{ this.mort = ..., this.altetat = ..., this.pv = ... }, type2{ ... }, type3 { ... }, type4 { ... }, type5 { ...}; 
} 

Natürlich, die nicht wegen der extends funktioniert. Ich dachte, dass ich Nenuphare als interface setzen und implements verwenden könnte, aber ich muss das Entwurfsmuster Strategie verwenden! Da ich neu bin, weiß ich nicht wirklich weiter.

Antwort

3

Machen Sie Nenuphare zum Enum.

Beispiel:

public enum Strategy{ 
    STRAT1("Strat1", new Mort1()), 
    STRAT2("Strat2", new Mort2()), 
    DEFAULT("default", new MortSubite()); 

    private final String name; 
    private final Mort mort; 

    public String getName(){ return name;} 
    public void death(){mort.mort();} //<- void does not really make sense here. 

    Strategy(String pName, Mort pMort){name = pName; mort = pMort;} 
} 

Jetzt tauschen Sie einfach "name" für "Tod", "Veränderung", ...

Verbrauch:

System.out.println(Strategy.DEFAULT.getName()); 

Siehe auch: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Hinweis: In einem internationalen Kontext sollten Sie englische Variablennamen verwenden. Das macht es für Nicht-Französisch-Sprecher einfacher, Ihren Code zu verstehen.

+0

Vielen Dank, aber wir mussten eine abstrakte Klasse verwenden, um im Designmuster Strategie zu bleiben! Sorry für die französischen Variablen übrigens. Für den 'öffentlichen void death() {...}' macht es Sinn für mich, da die Methode vorerst etwas druckt. – pioupiou1211

+0

Sie können abstrakte Klassen verwenden, müssen dies aber nicht tun. – Fildor

Verwandte Themen