Как добавить новые функции в класс без изменения вызываемого метода в Java - PullRequest
0 голосов
/ 03 мая 2018

Я хотел бы разработать класс, который может (или не может) реализовывать функциональные возможности, и быть открытым для добавления новых в будущем. Эти функции должны быть выполнены методом. Например:

class Hero()

doDamage(){
//simpleDamage
}

И

class BetterHero() implements EnableCriticAttack

doDamage(){
//damage with critic attack chance
}

Кроме того,

class WizardBetterHero() implements EnableCriticAttack, MagicDamage

doDamage(){
//damage with critic attack chance + magic damage
}

Я хотел бы добавить новые "специальные способности", используя правильный шаблон проектирования, чтобы метод doDamage() знал, какие способности использовать, и он работает правильно. Я не хочу создавать разные классы, просто «добавляю» новые функции в созданный класс: принцип открытия-закрытия.

PD: я поставил функциональность как интерфейс, но это всего лишь пример.

1 Ответ

0 голосов
/ 03 мая 2018

Различные способы нанесения ущерба - это поведение, которое предполагает использование шаблона проектирования Стратегии. Например, иметь интерфейс Damage, такой как:

public interface Damage {
    public void doDamage();
}

и несколько реализаций, таких как:

public class SimpleDamage implements Damage {
    public void doDamage() {
        System.out.println("simple damage");
    }
}

public class MagicDamage implements Damage {
    public void doDamage() {
        System.out.println("magic damage");
    }
}

Так что тогда нужен только один тип Hero, такой как:

public class Hero implements Damage {
    private final Damage damage;

    public Hero(Damage damage) {
        this.damage = damage;
    }

    public void doDamage() {
        damage.doDamage();
    }

}

Реализации Damage также могут использовать шаблон проектирования Decorator. Например, урон героя может включать несколько способов нанесения урона:

public class MagicDamage implements Damage {
    private final Damage additionalDamage;

    public MagicDamage(Damage additionalDamage) {
        this.additionalDamage = additionalDamage;
    }

    public void doDamage() {
        if (additionalDamage != null) {
           additionalDamage.doDamage();
        }
        System.out.println("magic damage");
    }
}

...

Hero hero = new Hero(new MagicDamage(new SimpleDamage());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...