我们遇到过的最有趣的设计模式是什么?
我们大多数人已经使用了MVC,策略等随意模式。
但是对于不寻常的问题必须有一些不寻常的解决方案,我很想听听。
解决方案
不,那是关于DP书籍的,而这个主题是关于特定模式的。
口译员和Flyweight从《 4人帮》一书中浮现。
我认为SW开发人员工具箱中的Bridge和Mediator功能强大且深入。
它更像是一种反模式,但我已经看到了我所谓的"将其全部保留在一个地方"的模式。这是一个大型应用程序,对于每个类(每个类),所有非局部变量都存储在称为P(用于参数)的单个类中。顺便说一句,所有静态变量都保存在一个名为...的类中,等待它...S。
无论如何,以某种方式,这个项目变得相当大,突然之间,没有任何效果。 (我这次被录用了)。令人惊讶的是,该程序没有崩溃,它只是具有大量副作用,使该应用程序无法正常运行。可以想象,多个线程都访问P和修改变量,而没有锁或者同步。
我告诉你,这真是一个让人眼前一亮的景象。
该公司开设了一个新办公室,并雇用了3个人来工作,我就是其中之一。我们得到了该程序,并要求对其进行修复。我们花了几天的时间只是拍拍我们的额头。我的脸上现在有永久的掌纹。
其他Funnies ...变量名为" fudgeFactor"。仍然不知道那是什么。
获取下一个ASCII字符的方法...
char getNextChar(char previous) { switch (previous) case 'a': return b; case 'b': return c; ... case 'z': return a; }
无论如何,这是我的有趣模式……还有一些有趣的额外方面。
来访者在处理大量图形的程序时第一次迷住了我,这是对复杂结构进行操作的一种非常优雅的方法。
除了mvc(本身不是pattenr)之外,就其复杂性和解决问题的潜力而言,这也是"模式之王"。
Fowler的Fluent Interface是一个非常有趣的模式。我也一直对抽象工厂,策略和状态模式情有独钟。
如果可以的话,我最近整理了一个称为"朋友类模式"的"模式",某些人可能会发现这种模式对限制不具有C ++样式的朋友类的语言中的私有字段访问者的可见性很有用或者有用。
由于显而易见的原因,我们将遇到的最有趣的设计模式是我们自己创建的。
这并不是说它将是最好的设计模式,而是最有趣的设计模式。
在我不得不直接使用ASM库操纵Java字节码之前,我从来没有看到过访问者模式的要点。令人惊讶的是,这种模式大大简化了原本会非常复杂的任务。
当我们要编写自己的重构插件时,大多数Java IDE也会使用该模式。我们提供了一个Visitor对象,该对象在AST周围传递,以进行所需的任何更改。
仅崩溃软件:
http://www.usenix.org/events/hotos03/tech/full_papers/candea/candea_html/
抽象的
仅崩溃的程序可以安全崩溃并快速恢复。只有一种方法可以停止此类软件-通过使其崩溃-并且只有一种方法可以通过启动恢复来启动它。仅崩溃的系统是从仅崩溃的组件构建的,并且透明组件级重试的使用对最终用户隐藏了系统内组件崩溃。在本文中,我们提倡针对Internet系统的仅崩溃的设计,表明它可以导致更可靠,可预测的代码以及更快,更有效的恢复。我们提出了有关如何构建此类仅崩溃的Internet服务的想法,并将成功的技术推向了逻辑极限。
与其说是模式,不如说是依赖注入和控制反转
去年,我一直在对用LANSA编写的Windows应用程序进行维护,该应用程序通过将所有控件都设置为tabStop = false来管理焦点,除了两个隐藏按钮(PrevFocus和NextFocus)。加载表单后,焦点将设置为一个字段,并且该字段的名称存储在跟踪变量(名为" FocusField")中。当用户使用标签(或者Shift-Tab)更改焦点时,将运行相应按钮的GotFocus事件。该函数内部是一个case语句(选择case FocusField)。根据当前关注的领域,运行验证逻辑,并且可能将关注点更改为另一个领域。
大多数控件的GotFocus事件查看FocusField的当前值是什么,然后调用LostFocus函数,该函数对FocusField执行相同的case语句,以便对先前关注的字段进行验证。
我们可能会猜到,这使得将UI与逻辑分离是不可能的,并且难以维护。使用一种简单的Validate方法重写这些表单,该方法将验证所有输入并让常规的制表符属性(TabOrder,TabStop等)发挥作用,通常可以减少50%的代码,并提供更加可靠的表单。
我不知道这种模式的起源,尽管它可能是由RPG /绿屏程序员梦turned以求的。