Design patterns 带有默认策略的策略模式

Design patterns 带有默认策略的策略模式,design-patterns,dependency-injection,strategy-pattern,Design Patterns,Dependency Injection,Strategy Pattern,说到设计模式,我算是个初学者。关于实施战略模式的想法如下: public class SomeClass { private Strategy strategy = new DefaultStrategy(); public void provideCustomStrategy(Strategy strategy) { this.strategy = strategy; } } 公共类{ 私有策略策略=新的DefaultStrategy(); publ

说到设计模式,我算是个初学者。关于实施战略模式的想法如下:

public class SomeClass { private Strategy strategy = new DefaultStrategy(); public void provideCustomStrategy(Strategy strategy) { this.strategy = strategy; } } 公共类{ 私有策略策略=新的DefaultStrategy(); public void提供客户策略(策略){ 这个。策略=策略; } }
这将确保松散耦合以及战略模式和DI的所有其他好处。同时,您不会强制用户提供策略,用户可以决定为角落案例等提供自定义策略。如果您为构造函数提供策略参数,则可以通过构造函数注入实现相同的目标。我认为这种实现在很多情况下都会提供最大的灵活性。

这种方法的缺点是您与DefaultStrategy类之间存在永久耦合。如果这带来了任何重大的负担,你可能会后悔这一点在未来

另一种方法可能是使用某种后期绑定。因此,您没有默认策略,而是有默认策略的名称。在运行时,第一次使用时,我们查找名称并加载相应的类。现在我们可以选择通过调整名称类映射来控制策略


这是JEE在JNDI中的资源查找启用的一种可能性。

< P>我认为最重要的事情是,这个实现会最好地满足您的需求吗?我确实同意提供一个setter(我会将名称改为setStrategy),但另一个缺点是客户需要确切知道哪些策略可用。向客户机提供该信息的一种方法是通过包含每个可用策略的枚举。然后客户端可以根据需要“热交换”它们


您可以在这里看到我的示例代码:,在“策略”部分下。

相关:谢谢!那个帖子澄清了一切!好主意。我想你也可以在使用时做一个空检查,并在没有提供自定义的情况下实例化默认策略。有点像lazyint。