【发布时间】:2010-09-10 21:58:32
【问题描述】:
在Refactoring to Patterns 中,作者通过让客户端使用 Loan 工厂方法来替换条件逻辑,其中每个方法对给定参数使用适当的策略。但是,我觉得它已经将条件逻辑代码传递给了客户端,客户端必须根据要调用的 Loan 工厂方法的参数进行选择。这不是移动而不是替换吗?
DP 书重蹈覆辙:
例如,如果没有策略,将文本分成几行的代码可能看起来像
void Composition::Repair () {
switch (_breakingStrategy) {
case SimpleStrategy:
ComposeWithSimpleCompositor();
break;
case TeXStrategy:
ComposeWithTeXCompositor();
break;
// ...
}
// merge results with existing composition, if necessary
}
策略模式通过将换行任务委托给策略对象来消除这种情况声明:
void Composition::Repair () {
_compositor->Compose();
// merge results with existing composition, if necessary
}
是的,但是如何从哪个 Strategy 类中选择实例化合成器呢?条件逻辑? 我看到如果上下文有层次结构,那么条件逻辑会更远,因为每个子类都可以实例化适当的策略,但这也适用于 Composition::repair(),每个子类将直接调用 ComposeWithSimpleCompositor的 ComposeWithTeXCompositor。
【问题讨论】:
标签: design-patterns refactoring