Java:更改单个基类的子类的行为而不扩展每个基类

时间:2014-10-09 21:56:33

标签: java inheritance

我们假设有一个类A,它实现了一个方法eatMuffinA有许多子类:AAAB,...,AZ,并且每个子类使用A的{​​{1}}实现1}}。如果在一个单独的库中我需要eatMuffin实际吃两个松饼,我可以在技术上将eatMuffin扩展到AA并覆盖每个AZ。如何以更干的方式实现此行为?

此外,如果您可以在评论中为此指出更简洁和有用的标题,则可获得奖励积分。

2 个答案:

答案 0 :(得分:1)

我建议的解决方案是装饰师。

我假设eatMuffin是界面的一部分。我们称之为EatsMuffins。类A实现了eatMuffin

创建一个实现DoubleMuffinEater的类EatsMuffins,并使用组合将松饼的使用方式委托给EatsMuffins的另一个实现。

public class DoubleMuffinEater implements EatsMuffins
{
    private EatsMuffins muffinEater;
    public DoubleMuffinEater(EatsMuffins muffinEater)
    {
        this.muffinEater = muffinEater;
    }
    @Override
    public void eatMuffin()
    {
        muffinEater.eatMuffin();
        muffinEater.eatMuffin();
    }
}

然后这个装饰者类只是让其他实现两次吃一个松饼。

这可以推广到其他不受干扰的操作。这样的方法只需调用另一个实现一次,一个简单的委托。

答案 1 :(得分:1)

我建议使用合成和依赖注入

使用Composition,让EatMuffin成为另一个班级的一员。然后,您可以通过依赖注入注入所需的行为。例如,

interface Eating {
   void eat();
}

interface A {
   Eating getEating();
   void setEating(Eating eating);
   void eatMuffin() throws EatingException;
}

class DefaultA implements A {

   private Eating eating;

   @Override
   public Eating getEating() {
      return eating;
   }

   @Override
   public void setEating(Eating eating) {
      this.eating = eating;
   }

   @Override
   public void eatMuffin() throws EatingException {
      if (eating == null) {
         throw new EatingException("No eating instance");         
      }
      eating.eat();      
   }
}