java - 将抽象类扩展为枚举 - 策略模式

标签 java design-patterns enums abstract

我正在尝试使用 Java 中的设计模式 Strategy。所以,我有一个名为 Nenuphare 的抽象类,它使用一些接口(interface)(MortAlterationEtatModifPV),我必须创造 5 种类型的 Nenuphare。如果我是对的,我必须将 Nenuphare 保留为一个抽象类,因为我想保留在设计模式 Strategy 中。最简单的方法是创建 5 个实现 Nenuphare 的类,并为每个类更改 MortAlterationEtatModifPV。但我必须使用 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/

相关文章:

java - 将 Java 对象转换为 Json,反之亦然?

java - Java中数字运算时如何避免类型安全警告?

java - 使用 Java opencv 连接 DVR 摄像头

java - 如何使用 java 动态重新排列网格布局中的项目?

swift - 在 Swift 中编写一个通用的主题-观察者实现

asp.net - 业务逻辑层是否应该实现授权和认证?

model-view-controller - ASP.NET MVC 模式 - 如何在 Controller 中使用两个单独的存储库(使用 DI)

java - 设计问题 : need instances of an enum member as (property, 值)对

c++ - 结构在单独的头文件中导致 C++ 中的问题

java - 检查枚举值,然后添加另一个字段(Java)