假设有一个类A
,它实现了一个方法eatMuffin
。 A
有许多子类:AA
,AB
,...,AZ
,每个子类都使用A
的eatMuffin
实现。如果在一个单独的库中,我实际上需要吃eatMuffin
两个松饼,则可以从技术上将AA
扩展到AZ
并为每个覆盖eatMuffin
。如何以更干燥的方式实现此行为?
另外,如果您能在评论中为此指出一个更简洁和有用的标题,则可以加分。
最佳答案
我提出的解决方案是装饰器。
我假设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();
}
}
然后,此装饰器类仅使其他实现两次吃一个松饼。
可以将其推广到其他不受干扰的操作。这样的方法只需调用另一个实现一次,即简单的委托。