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