假设有一个类A,它实现了一个方法eatMuffinA有许多子类:AAAB,...,AZ,每个子类都使用AeatMuffin实现。如果在一个单独的库中,我实际上需要吃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();
    }
}


然后,此装饰器类仅使其他实现两次吃一个松饼。

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

09-06 06:31