Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态向对象添加属性的设计模式_Java_Oop_Design Patterns - Fatal编程技术网

Java 动态向对象添加属性的设计模式

Java 动态向对象添加属性的设计模式,java,oop,design-patterns,Java,Oop,Design Patterns,假设我们有一个汽车物体。加速和中断功能使用策略模式实现。但是,如果我们想将硝基气体功能引入现有的汽车对象,该怎么办?我可以使用什么样的设计模式 我想在创建汽车对象后添加nitro功能(属性) 您可以选中,它可以用于动态地向现有对象添加功能。装饰器模式可以动态地向对象添加不同的功能。但这些功能必须在具体的装饰器中实现。开发人员可以决定在运行时添加哪些功能 如果要添加新方法,则需要创建新的子类和/或使用委派。如果“nitro”特性需要显式方法调用才能激活,则这是必需的 然而,如果您只想添加现有功能而

假设我们有一个汽车物体。加速中断功能使用策略模式实现。但是,如果我们想将硝基气体功能引入现有的汽车对象,该怎么办?我可以使用什么样的设计模式


我想在创建汽车对象后添加nitro功能(属性)

您可以选中,它可以用于动态地向现有对象添加功能。

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

如果要添加新方法,则需要创建新的子类和/或使用委派。如果“nitro”特性需要显式方法调用才能激活,则这是必需的

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


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

在静态类型语言中,不能在运行时向对象添加方法。编译器在遇到诸如:car.nitroAccelerate()之类的语句时,会检查car对象是否实现了任何具有nitroAccelerate方法的接口。如果您可以在运行时添加(或删除)方法,那么这样的检查将是不可能的

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

可以在运行时使用decorator修改现有方法,但这样做并不是修改现有对象,而是创建一个新对象来封装旧对象

所以,如果你做了如下事情:

Car fasterCar = new CarWithNitro(car);

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

我喜欢装饰器模式。但是我们可以使用装饰器模式在运行时添加新的状态或行为。装饰器模式是通过包装对象和公开扩展接口来添加功能。这个新的功能实现本身可能会使用额外的工具和技术,比如额外的设计模式。请记住,设计模式不是您自己代码的替代品,它是一种在适当的时候应该使用的工具。