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()?
可以进一步改善这种情况吗?
在当前示例中,您对传递给工厂的参数进行硬编码,从而决定 处的行为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