责任链设计模式和使用简单的 if-elseif-else 块有什么区别?

2023-11-21

前几天我正在查找责任链,我发现this例子。

基本上,有一个抽象处理程序,然后是具体处理程序,每个具体处理程序都实现父抽象处理程序的handle 方法。实现是这样的,首先检查该特定处理程序是否可以处理当前请求,如果不能,则将请求传递给其后继者。

现在,我还可以使用简单的 if-else 条件块来做同样的事情。以上面链接中的第一个示例为例,我将如何更改它:

class SingleHandler
{
    if(request > 0 && request <= 10)
    {
        // Process request
    }
    else if(request > 10 && request <= 20)
    {
        // Process request differently
    }
    else if(request > 20 && request <= 30)
    {
        // Process request differently
    }
}

现在,我的问题是,两者之间的根本区别是什么?如果我可以使用 if-else 块提供完全相同的功能,是否有任何具体原因我应该使用责任链?在性能、内存消耗、可维护性、可扩展性方面哪一个更好?


是的,您可以重写此示例以使用多个 if-else 级联。但这只是因为这是一个相当简单的例子。

The 责任链是一种动态模式。这意味着处理程序可以在运行时进行交换。这通常在 UI 代码中完成,其中多个嵌套控件可以代表处理程序。想象一下以下场景:

你有一扇窗户。在这个窗口中有某种面板。在此面板中有一个文本框。您右键单击文本框。执行的命令取决于层次结构。系统将要求第一个处理程序 - 文本框 - 处理点击请求。如果它不知道如何处理请求,则会将其传递给其父级(面板)等。我怀疑您是否想使用 if-else-cascade 来实现这种场景。每次更改 UI 时,都必须更改级联。这就是使用处理程序对象的原因。它使代码可交换和可重用。

许多模式可以通过不同的方式实现。这是没有面向对象的低级编程语言中的常见做法。然而,这些代码通常非常不灵活且难以维护。然而,这就是它们速度快的原因。

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

责任链设计模式和使用简单的 if-elseif-else 块有什么区别? 的相关文章

  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 构建器模式的真实示例

    我想看看 Builder 模式是如何在现实世界的应用程序 API 中使用的 我找到的例子都是披萨 蛋糕 汽车等等 加上 GoF 书中的解析器示例 您能否告诉我这个模式在现实世界的应用程序 API 中的一些用法 最好是来自 C NET 或 P
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 是检测异常并抛出它们还是让运行时抛出它们更好?

    假设有这样的设置 public class MyClass public void DoSomething string Data if String IsNullOrWhiteSpace Data throw new NullRefere
  • 如何将 sqldatareader 转换为 dto 列表?

    我刚刚开始将所有 ado net 代码从 asp net 页面移动到存储库 并为每个表创建 dto 手动 但现在我不知道将 sqldatareader 转换为我的列表的有效方法是什么dto 对象 例如 我的 dto 是 Customer 我
  • PHP:我是否将事件驱动编程与信号感知接口(信号和槽/观察者模式)混淆了?

    我看到很多人说 Symfony2 Zend Framework 2 等都是事件驱动的 在桌面世界中 通过事件驱动编程 我了解到应用程序每当其状态发生变化时都会通知其观察者 由于 PHP 应用程序是无状态的 因此无法执行此类操作 IE 让观察
  • 这种模式叫什么?软锁?

    这是我有时必须编写的一些代码 大部分与 UI 内容结合使用 并且总是与可能意外陷入无限循环的事件相关 public class MyClass public event EventHandler MyEvent private bool I
  • 在 Spring Singleton 中创建新实例会导致内存泄漏吗?

    我目前正在维护一个应用程序 并注意到许多在 Spring 接线中定义为 Singleton 的对象在其方法中创建了其他对象的新实例 例如 有一个 LoginService Singleton 每次调用 login 方法时都会创建 Login
  • 用更好的模式替换开关(Javascript)

    我必须升级我的应用程序以根据用户类型和角色属性显示页面 目前 我使用一个简单的 switch 语句来根据用户类型来执行此操作 例如 switch type case a return CONSTANT ONE case b return C
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 根据维基百科,为什么“call super”被视为反模式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java:getInstance 与静态

    目的是什么getInstance 在Java中 在我的研究过程中我一直在读getInstance 有助于实现单例设计模式 根据我的理解 这意味着整个程序中只有一个实例 但我不能只使用静态吗 这不是静态的全部意义吗 如果我只有静态方法和字段
  • IntelliJ可以自动创建装饰器类吗?

    有时 我创建一个像这样的装饰器类 class MyInterfaceDecorator implements MyInterface private final MyInterface delegate constructor taking
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以

随机推荐