设计模式以动态地向对象添加属性

时间:2012-11-20 09:41:02

标签: java oop design-patterns

考虑一下我们有一个Car对象。 加速打破功能是使用策略模式实现的。但是,如果我们想要将硝基气体特征引入现有的汽车对象,该怎么办?我可以使用的设计模式是什么?

我想在创建汽车对象后添加硝基特征(属性)。

4 个答案:

答案 0 :(得分:10)

您可以查看Decorator pattern,它可用于动态添加现有对象的功能。

答案 1 :(得分:2)

装饰器模式可以动态地为对象添加不同的功能。但是这些功能必须在Concrete Decorator中实现。开发人员可以决定在运行时添加哪些功能。

答案 2 :(得分:0)

如果要添加新方法,则需要创建新子类和/或使用委托。如果“nitro”功能需要显式方法调用来激活,那么这将是必要的。

但是,如果您想要做的就是在不添加方法的情况下添加到现有功能,那么Decorator是一个不错的选择。假设接口“Car”有一个名为floorIt()的方法。在这种情况下,您可以使用Decorator向floorIt添加“nitro kick”,而无需添加到Car inteface。

当然,这是一个中间立场。如果使用运行时类型发现和/或多个接口,则可以使用Decorator并将方法添加到结果对象。

答案 3 :(得分:-1)

在静态类型语言中,您无法在运行时向对象添加方法。编译器在遇到类似:car.nitroAccelerate()的语句时,检查car对象是否实现了具有nitroAccelerate方法的任何接口。如果您可以在运行时添加(或删除)方法,则无法进行此类检查。

动态语言允许在运行时添加方法。但是这有一个缺点,当你在代码中放入car.nitroAccelerate()时,你需要仔细分析这一点中的汽车对象是否有这样的方法。

您可以使用装饰器在运行时修改现有方法,但这样做,您不会修改现有对象,只需创建一个包装旧对象的新对象。

所以,如果你做了类似的事情:

Car fasterCar = new CarWithNitro(car);

并且你的一些代码仍然保留了对原车的引用,这辆原车不会更快,因为包装行为不会修改原件。