我们假设有一个类A
,它实现了一个方法eatMuffin
。 A
有许多子类:AA
,AB
,...,AZ
,并且每个子类使用A
的{{1}}实现1}}。如果在一个单独的库中我需要eatMuffin
实际吃两个松饼,我可以在技术上将eatMuffin
扩展到AA
并覆盖每个AZ
。如何以更干的方式实现此行为?
此外,如果您可以在评论中为此指出更简洁和有用的标题,则可获得奖励积分。
答案 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();
}
}