2016-10-11 3 views
3

Я пытаюсь использовать шаблон шаблона проектирования на Java. Итак, у меня есть абстрактный класс под названием Nenuphare, который использует некоторые интерфейсы (Mort, AlterationEtat и ModifPV), и мне нужно создать 5 типов Nenuphare. Если я прав, я должен оставить Nenuphare абстрактным классом, я хочу остаться в шаблоне дизайна. Самый простой способ - создать 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! Поскольку я новичок в этом, я действительно не знаю, как действовать.

ответ

3

Сделать 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

Sidenote: в международном контексте вы должны использовать английские имена переменных. Это упрощает для не-французских ораторов понимание вашего кода.

+0

Большое спасибо, хотя я должен был использовать абстрактный класс, чтобы оставаться в шаблоне дизайна Стратегии! К сожалению, для французских переменных. Для 'public void death() {...}' это имеет смысл для меня, поскольку метод печатает что-то на данный момент. – pioupiou1211

+0

Вы можете использовать абстрактные классы, но вам не обязательно. – Fildor