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

6

大多数人已经使用过诸如MVC策略等常见的设计模式。

但是,对于一些非常规问题,必须有一些非常规解决方案,我想听听您的看法。

10个回答

16

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

仅崩溃程序能够安全地崩溃并快速恢复。停止这种软件只有一种方法——通过崩溃它,唤醒它也只有一种方式——通过启动恢复。仅崩溃系统是由仅崩溃组件构建的,透明的组件级重试技术可以隐藏端点用户不可见的系统内部组件崩溃。在本文中,我们提倡互联网系统的崩溃式设计,并展示了它如何带来更可靠、可预测的代码和更快、更有效的恢复。我们提出了建立这样的互联网服务的思路,将成功的技术推向逻辑极致。


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;
}

无论如何,这是我的有趣模式……还有一些额外好玩的东西。

4
在过去的一年里,我一直在维护一个使用LANSA编写的Windows应用程序,其中焦点是通过将所有控件的tabStop设置为false,除了两个隐藏按钮(PrevFocus和NextFocus)来管理的。当加载表单时,焦点被设置到一个字段上,并且该字段的名称被存储在跟踪变量中(名为'FocusField')。当用户使用Tab键(或Shift-Tab键)改变焦点时,适当按钮的GotFocus事件会触发。在该函数内部有一个case语句(select case FocusField),根据当前聚焦的字段运行验证逻辑,并且可能将焦点更改到另一个字段。
大多数控件的GotFocus事件都会查看FocusField的当前值,然后调用一个LostFocus函数,该函数对FocusField执行相同的case语句工作,以便之前聚焦的字段将得到验证。
你可能已经猜到了,这使得无法将UI与逻辑分离,并且难以维护。将这些表单重写为使用简单的Validate方法来验证所有输入,并让常规的选项卡属性(TabOrder、TabStop等)发挥其魔力,通常会导致代码减少50%,并且表单更加可靠。
我不知道这种模式是从哪里起源的,尽管它可能是由RPG/green-screen程序员转变为WinForms开发人员编写的应用程序。

2

当我第一次在一个图形密集的程序上工作时,Visitor模式给我留下了深刻印象,它是对复杂结构进行操作的一种非常优雅的方式。

除了MVC(本质上不是一种模式),这是“模式之王”,因为它的复杂性和解决问题的潜力。


2
弗勒(Fowler)的流畅接口(Fluent Interface)是一种非常有趣的模式。我一直对抽象工厂、策略和状态模式很感兴趣。
如果可以的话,最近我编写了一个“模式”,称之为友元类模式(Friend Class Pattern),在某些语言中,可以用于限制私有字段访问器的可见性,这可能会引起一些人的兴趣或有用。这些语言不像C++那样有友元类。

嗯,流畅。Linq 就是为此而构建的。 - Dykam
1
我不知道我是否会将Linq描述为流畅的接口。根据我的经验,流畅的接口通常被设计成可以像英语短语一样阅读调用。流畅接口的方法通常非常具有状态性——在不同的时间调用相同的方法会产生截然不同的结果。Linq更多地是关于组合将用于处理数据集的管道。没有任何Linq方法改变任何状态——它们只是返回一个新对象。Linq方法对我来说感觉更像是“方法”而不是“短语”。但这只是我的看法。 - Daniel Yankowsky

2

这不是一个具体的设计模式,而是依赖注入和控制反转。


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

我的一个朋友认为策略模式本质上是原始模式。许多其他模式(桥接、装饰、代理、状态等)只是策略的更精细的应用。我记得我和他争论了相当长的时间,认为策略和状态确实有区别。


1

不,那是关于DP书籍的内容,而这个帖子是关于特定模式的。

从四人帮的书中,我想到了解释器和享元模式。

我认为桥接模式和中介者模式是软件开发者工具箱中强大而深入的模式。


我喜欢你的帖子,但是你可以添加关于你描述的模式的解释。 - Bite code

1

在使用ASM库直接操作Java字节码时,我从未看到过访问者模式的意义。令人惊讶的是,这种模式简化了本来可能非常复杂的任务。

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


0

你将会遇到的最有趣的设计模式是你自己创造的,这是显而易见的。

这并不意味着它会是最好的设计模式,只是最有趣的。


2
不是我。一旦我创造了某些东西,即使我感到很自豪,它也变得微不足道,因此完全没有兴趣。那些我还不熟悉的东西才有趣。 - ChrisA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接