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

Syn*_*hro 5 java methods design-patterns factory strategy-pattern

我正在学校参加设计模式课程,并阅读了Head First Design Patterns的一些章节.我想知道的是设计模式在多大程度上可以防止重写现有代码.

我们以Duck课程和FlyBehavior课程为例.我有public static void main(String[] args)以下代码:

Duck mallard = new MallardDuck(new FlyWithWings());
Run Code Online (Sandbox Code Playgroud)

我是否正确地说,main()当您想要添加新策略时,您不得不修改方法?这样,您正在修改现有代码,对吧?我特别指的是提到具体策略类的部分:new FlyWithWings().

如果在代码中实现了工厂方法模式,则可能会阻止具体的类(FlyWithWings)被提及:

public FlyBehavior returnBehavior(FlyBehaviorFactory factory, String behaviorType) {
    return factory.getFlyBehavior(behaviorType);
}
Run Code Online (Sandbox Code Playgroud)

因此,请使用以下代码行:

Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));
Run Code Online (Sandbox Code Playgroud)

这样,程序的某个部分不必知道要使用的FlyBehaviorFactory.但是,您的main()方法仍然需要在returnBehavior方法中指定某些参数,以便了解哪个工厂将创建什么策略.因此,我是否正确地说,main()如果我添加了一个新的FlyBehavior类,你仍然需要修改,并希望将其作为参数添加到returnBehavior()

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

CKi*_*ing 0

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

Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));
Run Code Online (Sandbox Code Playgroud)

这可以更改为插入特定行为而runtime不是compile time

Duck mallard = new MallardDuck(returnBehavior(flyFactory, args[0]));
Run Code Online (Sandbox Code Playgroud)

通过上述更改,您将永远不必更改您的main方法。当运行时收到的行为不可用时,throws您的工厂可以这样编写:exception

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

话虽这么说,如果引入新行为,更改代码是不可避免的。尽管如此,这种变化将发生在一个地方,并尽可能落后于您的应用程序,即您的应用程序,factory这就是factory首先的全部要点。此外,当您创建新的 时FlyBehavior,您是通过从现有类扩展来实现的。这与open-closed principle