繁体   English   中英

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

[英]Extends an abstract class to an enum - Strategy Pattern

我正在尝试使用Java中的设计模式策略。 所以,我有一个名为Nenuphare的抽象类,它使用一些接口( MortAlterationEtatModifPV ),我必须创建5种类型的Nenuphare。 如果我是对的,我必须保持Nenuphare作为一个抽象类是我想留在设计模式战略。 最简单的方法是创建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 ,但我必须使用设计模式策略! 由于我是新手,我真的不知道如何继续。

让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

旁注:在国际范围内,您应该使用英文变量名称。 这使得非法语人士更容易理解您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM