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

标签 java design-patterns methods factory strategy-pattern

我正在学校上一门设计模式类(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/

相关文章:

java - 通过名称获取 JSON 对象值 Java

c++ - 多种输出格式的设计模式

php - 用户设计模式

Swift:access.property 和 access.method()

c# - 如何声明一个可以被每个方法使用的变量? | C#

java - HQL - SELECT 子句上的 COUNT 不起作用

java - 如何设置安卓锁屏图片

java - 如何在neo4j 2.0中使用索引进行同类搜索?

javascript - 基于原型(prototype)继承在实际项目中的应用

java从同一个包导入