动态向对象添加属性的java设计模式 2 周,1 日 Questions & Answers 7685 考虑到我们有一个汽车物体。加速和中断功能使用策略模式实现。但是,如果我们想将硝基气体功能引入现有的汽车对象,该怎么办?我可以使用什么样的设计模式 我想在创建汽车对象后添加nitro功能(属性)
# 2 楼答案 如果要添加新方法,则需要创建新的子类和/或使用委派。如果“nitro”特性需要显式方法调用才能激活,则这是必需的 然而,如果您只想添加现有功能而不添加方法,那么Decorator是一个不错的选择。假设接口“Car”有一个名为floorIt()的方法。在这种情况下,您可以使用Decorator向Floorrit添加“nitro kick”,而无需添加到汽车接口 当然,有一个中间立场。如果使用运行时类型发现和/或多个接口,则可以同时使用Decorator和向结果对象添加方法
# 3 楼答案 在静态类型语言中,不能在运行时向对象添加方法。编译器,当它遇到像:car这样的语句时。nitroAccelerate(),检查汽车对象是否实现了任何具有nitroAccelerate方法的接口。如果您可以在运行时添加(或删除)方法,那么这样的检查将是不可能的 动态语言允许在运行时添加方法。但这有一个缺点,当你把车。nitroAccelerate()在代码中,您需要仔细分析此时的car对象是否有这样的方法 可以在运行时使用decorator修改现有方法,但这样做并不是修改现有对象,而是创建一个新对象来封装旧对象 所以,如果你做了如下事情: Car fasterCar = new CarWithNitro(car); 你的一些代码仍然引用了原始的汽车,这个原始的汽车不会更快,因为包装的行为不会修改原始的汽车
# 1 楼答案
装饰器模式可以动态地向对象添加不同的功能。但这些功能必须在具体的装饰器中实现。开发人员可以决定在运行时添加哪些功能
# 2 楼答案
如果要添加新方法,则需要创建新的子类和/或使用委派。如果“nitro”特性需要显式方法调用才能激活,则这是必需的
然而,如果您只想添加现有功能而不添加方法,那么Decorator是一个不错的选择。假设接口“Car”有一个名为floorIt()的方法。在这种情况下,您可以使用Decorator向Floorrit添加“nitro kick”,而无需添加到汽车接口
当然,有一个中间立场。如果使用运行时类型发现和/或多个接口,则可以同时使用Decorator和向结果对象添加方法
# 3 楼答案
在静态类型语言中,不能在运行时向对象添加方法。编译器,当它遇到像:car这样的语句时。nitroAccelerate(),检查汽车对象是否实现了任何具有nitroAccelerate方法的接口。如果您可以在运行时添加(或删除)方法,那么这样的检查将是不可能的
动态语言允许在运行时添加方法。但这有一个缺点,当你把车。nitroAccelerate()在代码中,您需要仔细分析此时的car对象是否有这样的方法
可以在运行时使用decorator修改现有方法,但这样做并不是修改现有对象,而是创建一个新对象来封装旧对象
所以,如果你做了如下事情:
你的一些代码仍然引用了原始的汽车,这个原始的汽车不会更快,因为包装的行为不会修改原始的汽车
# 4 楼答案
您可以检查Decorator pattern,它可以用于动态地向现有对象添加功能