向界面装饰器模式添加功能

Adding function to interface decorator pattern

你好,

我正在努力思考装饰器模式,但我不确定某些事情:

当我想添加新功能时,将功能添加到界面被认为是一种不好的做法或滥用模式?

比如我有一个汽车界面,我想用装饰让它变成水陆两用,是否允许在界面上添加一个getAquaticSpeed()功能仅用于添加此功能?

提前致谢!

代码示例:

interface Car{
   public float getSpeed();
}

public class CarFrame implements Car{
    public float getSpeed(){return 0;}
}

public abstract CarDecorator implements Car{
    private Car delegate;

    public CarDecorator(Car delegate){
        this.delegate = delegate
    }

    public float getSpeed(){return delegate.getSpeed();}
}

如果我想为我的汽车添加水上速度、颜色等,是否允许在我的主界面中添加新功能?

像这样:

interface Car{
   public float getSpeed();
   public float getAquaticSpeed();
   public String getColor();
}

您当然可以添加装饰器的 API,使其成为它包装的对象中接口的超集。 GoF书Decorator章节的第一句话是,

Intent
Attach additional responsibilities to an object dynamically.

本书第 177 页的 UML 结构显示了具有 addedStateAddedBehavior() 的具体装饰器,因此通过添加函数来附加责任是完全可以接受的。


关于编辑,不能修改之前的界面。那会违反单一职责原则,Open/Closed原则,除此之外,它与装饰者模式无关。如果你编辑原来的界面,装饰器是没有用的。