如何用策略替换(而不仅仅是移动)条件逻辑?

2024-01-05

In 作者通过让客户端使用贷款工厂方法来替换条件逻辑,其中每个方法针对给定参数使用适当的策略。但是,我觉得它已将条件逻辑代码传递给客户端,客户端必须根据参数选择要调用哪个 Loan 工厂方法。这不是移动而不是替换吗?

DP 的书也强调了同样的错觉:

例如,如果没有策略,将文本分成行的代码可能如下所示

void Composition::Repair () {
    switch (_breakingStrategy) {
    case SimpleStrategy:
        ComposeWithSimpleCompositor();
        break;
    case TeXStrategy:
        ComposeWithTeXCompositor();
        break;
    // ...
    }
    // merge results with existing composition, if necessary
}

Strategy 模式通过将换行任务委托给 Strategy 对象来消除这种 case 语句:

void Composition::Repair () {
    _compositor->Compose();
    // merge results with existing composition, if necessary
}

是的,但是如何选择哪个策略类来实例化合成器呢?条件逻辑? 我发现如果上下文有层次结构,那么条件逻辑会更远,因为每个子类都可以实例化适当的策略,但这也适用于 Composition::repair() ,其中每个子类将直接调用 ComposeWithSimpleCompositor的 ComposeWithTeXCompositor。


是的——设计模式的选择有时会改变逻辑而不是取代它。

不过我不太明白你的反对意见。一些决策逻辑已经在客户端中,策略巩固了决策。

在您的代码示例中

void Composition::Repair () {
    switch (_breakingStrategy) {
    case SimpleStrategy:
        ComposeWithSimpleCompositor();
        break;
    case TeXStrategy:
        ComposeWithTeXCompositor();
        break;
    // ...
    }
    // merge results with existing composition, if necessary
}

the _breakingStrategy字段必须在某个地方提供,大概是由客户端代码确定要使用哪种组合方法并将该决定的结果作为值传递_breakingStrategy.

应用策略的唯一作用是让该决策提供一个策略子类,而不是像现在这样的“类型代码”,从而巩固该决策。

当然,这个决定必须在某个地方做出。如果您感觉Composition::Repair方法是它的正确位置,您当然可以完全不使用策略模式。

如果您想使用策略,但不想在客户端中使用逻辑(比现有逻辑更多),则包含类似开关的工厂方法可以提供它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用策略替换(而不仅仅是移动)条件逻辑? 的相关文章

  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 如何在 C# 中重构 log4net 语句?

    好吧 读完丹本对此的回答后post https stackoverflow com questions 2230180 whats log4j actually doing when we turn on or off some log p
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 存储库模式和 Linq to sql

    我正在尝试使用角色表 用户表和具有用户 ID 角色 ID 的外部参照表来实现用户身份验证和授权 为了实现通用存储库来更新角色 插入角色 添加用户 将用户添加到角色 更新用户 更新用户角色 验证用户 添加用户会话进行审核等 我是否需要为每个存
  • Python:如何重构循环导入

    我有件事可以帮你做engine setState
  • 策略、访问者和模板方法模式之间有什么区别?

    我在课堂上刚刚学习了这些设计模式 但是我看不出它们之间有什么区别 它们听起来是一样的 都是在抽象类之上创建具体类 有人可以帮我打消这个疑虑吗 谢谢 访问者 策略和模板模式都包含算法的应用 最大的区别在于它们是如何被唤起以及如何在实践中使用的
  • F#:模式构成?

    我正在尝试编写一个由另外两个模式组成的模式 但我不确定如何去做 我的输入是字符串列表 文档 我有一个与文档标题匹配的模式和一个与文档正文匹配的模式 该模式应该匹配整个文档并返回标题和正文模式的结果 您可以使用以下命令一起运行两个模式 您在问
  • 工厂设计模式

    我正在尝试实现工厂设计模式 并且到目前为止已经做到了这一点 import abc class Button object metaclass abc ABCMeta html def get html self html return se
  • 如何在C++中正确实现工厂方法模式

    C 中有这样一件事让我在很长一段时间内感到不舒服 因为老实说我不知道 该怎么做 尽管它听起来很简单 如何在 C 中正确实现工厂方法 目标 允许客户端使用工厂方法而不是对象的构造函数来实例化某个对象 而不会产生不可接受的后果和性能影响 我所说
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 根据维基百科,为什么“call super”被视为反模式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 组织 jQuery/JavaScript 代码的最佳方式 (2013) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 问题 这个答案之前已经回答过 但已经
  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • 使用超类创建构建器时,父类无法返回子类的实例[重复]

    这个问题在这里已经有答案了 如果我使用构建器模式来配置新对象 我可能有两个类 例如Game and HockeyGame 如下所示 当我想创建一个新的HockeyGame 我得到它的构建器并开始调用方法来根据需要配置对象 我遇到的问题显示在
  • @VisibleForTesting 的替代方案

    我知道 VisibleForTesting 是不可取的 因为它只是为了测试目的而更改类的接口 理想情况下 我们应该测试我们实际使用的接口 但什么是一个好的替代方案呢 You use VisibleForTesting正如您所说 当您想要测试

随机推荐