我正在尝试使用 Java 中的设计模式 Strategy。所以,我有一个名为 Nenuphare
的抽象类,它使用一些接口(interface)(Mort
、AlterationEtat
和 ModifPV
),我必须创造 5 种类型的 Nenuphare。如果我是对的,我必须将 Nenuphare
保留为一个抽象类,因为我想保留在设计模式 Strategy 中。最简单的方法是创建 5 个实现 Nenuphare 的类,并为每个类更改 Mort
、AlterationEtat
和 ModifPV
。但我必须使用 enum
来做到这一点。不幸的是,枚举不能扩展类,因为它已经扩展了枚举类型。
这是我的 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();
}
}
我尝试以这种方式创建我的 5 类型的 Nenuphare
:
public enum TypeNenuphare extends Nenuphare {
type1{ this.mort = ..., this.altetat = ..., this.pv = ... }, type2{ ... }, type3 { ... }, type4 { ... }, type5 { ...};
}
当然,由于 extends
,那是行不通的。我以为我可以将 Nenuphare
设置为 interface
并使用 implements
,但我必须使用设计模式 Strategy!由于我是新手,所以我真的不知道如何进行。
最佳答案
让 Nenuphare 成为枚举。
例子:
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;}
}
现在只需将“名字”换成你的“死亡”、“改变”、...
用法:
System.out.println(Strategy.DEFAULT.getName());
另请参阅:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
旁注:在国际环境中,您应该使用英文变量名。这让非法语人士更容易理解您的代码。
关于java - 将抽象类扩展为枚举 - 策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978341/