有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

设计模式如何在不改变Java中被调用方法的情况下向类添加新功能

我想设计一个可以(或不可以)实现功能的类,并在将来开放添加新的功能。这些功能必须通过方法执行。例如:

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) 个答案

  1. # 1 楼答案

    造成损害的不同方式是一种建议使用策略设计模式的行为。例如,有一个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());