在实现策略模式,你如何确定哪个类负责 为:谁应该实例化并分配运行时策略实现?
选择特定的具体战略实施传递给Context类(假设选择是基于一些复杂的业务逻辑而不是一个静态的标志)
实例化前面提到的具体实施和实际将其注入Context类
感觉就像那里应该有一些客观的指导,包括这个。我已经对各种OOP模式(即GRASP和SOLID)进行了一些阅读,但对于这个特定问题我还是没有很清楚的。
在实现策略模式,你如何确定哪个类负责 为:谁应该实例化并分配运行时策略实现?
选择特定的具体战略实施传递给Context类(假设选择是基于一些复杂的业务逻辑而不是一个静态的标志)
实例化前面提到的具体实施和实际将其注入Context类
感觉就像那里应该有一些客观的指导,包括这个。我已经对各种OOP模式(即GRASP和SOLID)进行了一些阅读,但对于这个特定问题我还是没有很清楚的。
这与我在DI容器中遇到的问题非常接近。看看here,马克西曼提供了一个很好的答案。
如果您试图解决特定情况,那么您正在寻找abstract factory pattern。工厂确定如何基于运行时信息实例化一系列类型。
如果您想知道如何解决这种情况,您正在寻找一个Inversion of Control container,它管理着依赖关系的组织和实现。战略的注册将包括条件逻辑。
该决定是特定于上下文的,就像Desing Patterns的其他一切一样。从GoF书中引用(斜体我的):
什么是设计模式?
克里斯托弗·亚历山大说,“每个模式都描述了发生一遍又一遍在我们的环境出了问题,然后介绍了该解决方案的核心,这个问题,在这样一种方式,你可以使用此解决方案上百万次没有以同样的方式执行两次“[AIS + 77,第x页]。即使亚历山大在谈论建筑和城镇的模式,他所说的关于面向对象设计模式也是如此。我们的解决方案是用物体和界面而不是墙壁和门来表示的,但是这两种模式的核心都是,这是对上下文中的问题的解决方案。
...
的解决方案介绍组成设计,它们之间的关系,责任和合作的元素。解决方案没有描述特定的具体设计或实现,因为模式就像可以在许多不同情况下应用的模板。相反,该模式提供了设计问题的抽象描述,以及元素(我们的例子中的类和对象)的一般布置如何解决它。
我在工作中使用Spring.NET的IOC,我没有看到一个简单的方法来将具体的实现与条件逻辑相关联,至少在使用纯粹的XML配置解决方案时没有。 – 2009-12-23 17:13:47
我不知道如何在Spring.NET中添加条件逻辑。我使用Autofac,它使用lambda表达式,因此在注册时允许任何逻辑。在你的情况下,我认为你应该申报一个工厂并将它注册到你的IoC容器中。这将允许您集中条件逻辑,同时将其分发给任何需要它的人。 – 2009-12-23 18:54:08