gpt4 book ai didi

java - 使用设计模式时,您可以在多大程度上防止修改现有代码?

转载 作者:搜寻专家 更新时间:2023-11-01 00:56:01 24 4
gpt4 key购买 nike

我正在学校上一门设计模式类(class),并且已经通读了 Head First Design Patterns 的一些章节。我想知道的是设计模式能在多大程度上防止重写现有代码。

让我们以Duck 类和FlyBehavior 类为例。我在 public static void main(String[] args) 中有以下代码:

Duck mallard = new MallardDuck(new FlyWithWings());

当您想要添加新策略时,您不可避免地必须修改您的 main() 方法,我说得对吗?这样,您就是修改现有代码,对吧?我特指提到具体策略类的部分:new FlyWithWings()。

如果您在代码中实现了工厂方法模式,则可以完全避免提及具体类 (FlyWithWings):

public FlyBehavior returnBehavior(FlyBehaviorFactory factory, String behaviorType) {
return factory.getFlyBehavior(behaviorType);
}

因此,有以下代码行:

Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));

这样,您的程序的某个部分就不必知道要使用什么 FlyBehaviorFactory。然而,您的 main() 方法仍然必须在 returnBehavior 方法中指定某些参数,以便了解哪个工厂将创建什么策略。因此,如果我添加了一个新的 FlyBehavior 类,并且想将其作为参数添加到 returnBehavior()?

是否可以进一步改善这种情况?

最佳答案

在当前示例中,您对传递给工厂的参数进行硬编码,从而决定编译时的行为。

Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));

这可以更改为在运行时而不是编译时插入特定行为:

Duck mallard = new MallardDuck(returnBehavior(flyFactory, args[0]));

通过上述更改,您将永远不必更改main 方法。当在运行时收到的行为不可用时,您的工厂可以以抛出 异常的方式编写:

if(behaviorType.equals("wings") {
//...create FlyWithWings
} else{
//throw an appropriate exception indicating that the behavior does not exist
}

也就是说,如果引入新行为,则不可避免地要更改代码。虽然,这种变化将发生在一个地方,并且尽可能落后于您的应用程序,即您的 factory 这是 factory 的全部要点。此外,当您创建新的 FlyBehavior 时,您是通过从现有类扩展来实现的。这符合开闭原则

关于java - 使用设计模式时,您可以在多大程度上防止修改现有代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com