【问题标题】:What is the most interesting design pattern you've ever met?你遇到过的最有趣的设计模式是什么?
【发布时间】:2010-09-11 10:21:24
【问题描述】:

我们大多数人已经用过MVCstrategy等休闲模式。

但是对于不寻常的问题,肯定有一些不寻常的解决方案,我很想听听。

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    仅崩溃软件: http://www.usenix.org/events/hotos03/tech/full_papers/candea/candea_html/ 摘要

    仅崩溃程序可以安全崩溃并快速恢复。只有一种方法可以阻止此类软件——通过使其崩溃——并且只有一种方法可以启动它——通过启动恢复。仅崩溃系统是从仅崩溃组件构建的,并且使用透明组件级重试可隐藏最终用户的系统内组件崩溃。在本文中,我们提倡互联网系统的仅崩溃设计,表明它可以导致更可靠、可预测的代码和更快、更有效的恢复。我们提出了有关如何构建此类仅崩溃的 Internet 服务的想法,将成功的技术发挥到逻辑上的极致。

    【讨论】:

      【解决方案2】:

      这更像是一种反模式,但我已经看到了我所说的“将所有内容保存在一个地方”的模式。这是一个大型应用程序,其中所有非本地变量,对于每个类,每个类,都存储在一个名为 P(用于参数)的类中。顺便说一句,所有静态变量都保存在一个名为...等待它的类中...S。

      不管怎样,这个项目变得相当大,突然之间,没有任何效果。 (我是在这个时候被录用的)。令人惊讶的是,该程序并没有崩溃,它只是有大量的副作用,使应用程序运行起来很糟糕。可以想象,多个线程都访问 P 和修改变量,没有锁定或同步。

      我告诉你,这真是一个值得一看的景象。

      公司开设了一个新办公室,并聘请了 3 个人来为其工作,我就是其中之一。我们得到了程序并被告知要修复它。我们花了几天时间坐在周围只是拍拍我们的额头。我现在脸上有一个永久性的掌纹。

      其他有趣的...变量名为“fudgeFactor”。还是不知道那是怎么回事。

      获取下一个ASCII字符的方法...

      char getNextChar(char previous) {
      
      switch (previous)
      case 'a': return b;
      case 'b': return c;
      ...
      case 'z': return a;
      }
      

      不管怎样,这就是我的有趣模式……加上一些额外的有趣的一面。

      【讨论】:

        【解决方案3】:

        去年我一直在维护一个用 LANSA 编写的 Windows 应用程序,其中的焦点是通过将所有控件设置为 tabStop = false 来管理的,除了两个隐藏按钮(PrevFocus 和 NextFocus)。加载表单时,焦点被设置到一个字段,并且该字段的名称存储在跟踪变量中(恰当地命名为“FocusField”)。当用户使用 tabs(或 shift-tabs)改变焦点时,相应按钮的 GotFocus 事件就会运行。该函数内部是一个案例语句(选择案例 FocusField)。根据当前关注的字段,运行验证逻辑,并可能将焦点更改为另一个字段。

        大多数控件的 GotFocus 事件会查看 FocusField 的当前值,然后调用 LostFocus 函数,该函数对 FocusField 执行相同的 case 语句,以便验证先前聚焦的字段。

        正如您可能猜到的那样,这使得将 UI 与逻辑分开是不可能的,并且维护起来令人难以置信。重写这些表单以使用简单的 Validate 方法来验证所有输入并让正常的选项卡属性(TabOrder、TabStop 等)发挥作用,这通常会导致代码减少 50% 并大大提高表单的可靠性。

        我不知道这种模式起源于何处,尽管它可能是由 RPG/绿屏程序员转为 WinForms 开发人员编写应用程序的梦想。

        【讨论】:

          【解决方案4】:

          在处理大量图形程序时,访问者第一次吸引了我,作为对复杂结构进行操作的一种非常优雅的方式。

          除了 mvc(它本身不是模式)之外,就其复杂性和解决问题的潜力而言,这是“模式之王”。

          【讨论】:

            【解决方案5】:

            Fowler 的Fluent Interface 是一个非常有趣的模式。我也一直对抽象工厂、策略和状态模式情有独钟。

            如果可以的话,我最近编写了一个我称之为Friend Class Pattern 的“模式”,有些人可能会觉得它对限制没有 C++ 风格友元类的语言中私有字段访问器的可见性很有趣或有用。

            【讨论】:

            • 嗯,流利。 Linq 就是为它而构建的。
            • 我不知道我会将Linq描述为一个流畅的界面。以我的经验,流畅的界面通常被设计成可以像英语短语一样阅读调用。流畅接口的方法通常是非常有状态的——在不同时间调用相同的方法会产生截然不同的结果。 Linq 更多的是关于组成一个用于处理一组数据的管道。所有 Linq 方法都不会改变任何状态——它们只是返回一个新对象。 Linq 方法对我来说比“短语”更“方法”。但这只是我的看法。
            【解决方案6】:

            与其说是一种模式,不如说是依赖注入和控制反转

            【讨论】:

              【解决方案7】:

              我记得当我第一次在 GOF 中读到 flyweight pattern 时。他们使用的例子是文字处理器;他们指出了使用独立对象来表示每个角色的缺点。享元模式鼓励将可共享的、内在的、不可变的状态与不可共享的、外在的、可变的状态分开。对我来说,当时,它是那些“啊哈!”之一。这些时刻真正拓宽了我的视野,并影响了我的设计至今。

              我的一个朋友建议策略模式本质上是祖先模式。许多其他模式(桥接、装饰器、代理、状态等)只是策略的更精细应用。我记得我和他争论了很长时间,战略和状态之间确实存在差异。

              【讨论】:

                【解决方案8】:

                不,那是关于 DP 书籍的,而这个线程是关于特定模式的。

                Interpreter 和 Flyweight 是从 Gang of 4 书中想到的。

                我认为 sw 开发人员工具箱中的 Bridge 和 Mediator 是强大而深入的模式。

                【讨论】:

                • 我喜欢你的帖子,但你可以添加关于你所描述的模式的解释。
                【解决方案9】:

                您将遇到的最有趣的设计模式是您自己创建的,原因很明显。

                这并不是说它将是最好的设计模式,只是最有趣的。

                【讨论】:

                • 不是我。一旦我创造了一些东西,即使我为它感到自豪,它也会变得微不足道,因此完全无趣。有趣的是我还不熟悉的东西。
                【解决方案10】:

                在我不得不直接使用ASM 库来操作Java 字节码之前,我从来没有看到访问者模式的意义。令人惊讶的是,这种模式大大简化了原本非常复杂的任务。

                当您想编写自己的重构插件时,大多数 Java IDE 也使用该模式。您提供一个访问者对象,并通过 AST 传递它以进行所需的任何更改。

                【讨论】: