你见过的最有趣的设计模式是什么?

时间:2008-09-19 20:09:46

标签: design-patterns

我们大多数人已经使用了MVCstrategy等随意模式。

但对于不寻常的问题必定会有一些不寻常的解决方案,我想听听它。

10 个答案:

答案 0 :(得分:15)

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

仅崩溃程序安全崩溃并快速恢复。通过启动恢复,只有一种方法可以阻止这种软件 - 通过崩溃 - 只有一种方法来实现它。仅限崩溃的系统是由仅崩溃的组件构建的,并且使用透明的组件级重试可以隐藏最终用户的系统内组件崩溃。在本文中,我们提倡仅针对Internet系统的崩溃设计,表明它可以带来更可靠,可预测的代码以及更快,更有效的恢复。我们提出了如何构建此类仅限崩溃的Internet服务的想法,将成功的技术应用于其逻辑极端。

答案 1 :(得分:5)

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

无论如何,一些如何,这个项目变得非常大,突然之间没有任何效果。 (这次我被录用了)。令人惊讶的是,该程序没有崩溃,只是有大量的副作用使应用程序运行变得棘手。可以想象,多个线程,都访问P和修改变量,没有锁定或同步。

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

该公司开设了一个新的办公室,并聘请了3名员工,我就是其中之一。我们给了程序并告诉它修复它。我们花了几天时间坐着打我们的额头。我现在脸上有一层透明的掌纹。

其他有趣......变量名为“fudgeFactor”。仍然不知道那是做什么的。

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

char getNextChar(char previous) {

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

无论如何,那是我有趣的模式......还有一些额外的一面搞笑。

答案 2 :(得分:4)

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

大多数控件的GotFocus事件查看FocusField的当前值是什么,然后调用LostFocus函数,该函数为FocusField执行相同的case语句工作,以便以前聚焦的字段得到验证。

正如你可能猜到的那样,这使得无法将UI与逻辑分开,并且难以置信的苦差事要维持。重写这些表单以使用一个简单的Validate方法来验证所有输入并让普通的tabbing属性(TabOrder,TabStop等)发挥其魔力通常会导致代码减少50%并且形式更加可靠。

我不知道这个模式的起源,尽管可能是RPG /绿屏程序员转向编写该应用程序的WinForms开发人员所设想的。

答案 3 :(得分:2)

当一个图形繁重的程序工作时,访客第一次困扰我,这是在复杂结构上进行操作的一种非常优雅的方式。

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

答案 4 :(得分:2)

福勒的Fluent Interface是一个非常有趣的模式。对于抽象工厂,战略和州模式,我总是情有独钟。

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

答案 5 :(得分:2)

不是一个模式,而是依赖注入和控制反转

答案 6 :(得分:2)

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

我的一位朋友建议战略模式基本上是祖先模式。许多其他模式(Bridge,Decorator,Proxy,State,...)只是Strategy的更精炼的应用程序。我记得与他争论已有一段时间,战略与国家之间确实存在差异。

答案 7 :(得分:1)

不,那是关于DP书籍的,这个主题是关于特定的模式。

译者和Flyweight来自Gang of 4书。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

在我不得不使用ASM库直接操作Java字节码之前,我从未看过访问者模式的要点。令人惊讶的是,这种模式简化了多少本来是一项非常复杂的任务。

当您想编写自己的重构插件时,该模式也可用于大多数Java IDE中。您提供了一个Visitor对象,它将在AST周围传递,以进行所需的任何更改。