哪些设计模式未得到充分利用?
是否有我们经常使用的特定的"四人一组设计模式",却很少在其他人的设计中使用?如果可能,请描述一个简单的示例,其中该模式可能有用。它不一定必须是"四人一组"模式,但是如果我们选择非GoF模式,请在模式说明中包含一个超链接。
换一种方式:
我或者对主要模式有较深了解的其他人可能还不知道哪些良好/有用的设计模式?
解决方案
可能是战略模式?我看到使用它的人不多,当计算更改或者可以一起累积时,它很有用。当一部分计算可以被另一种计算替代时,我会使用它。通常在用于企业对产品进行定价的程序中。
这是一些文件:
- 维基百科
- DoFactory
对于许多新开发人员而言,Visitor模式似乎很难理解。当我有可能获得"国家">"州">"城市">"房屋"的价值时,我将其用于微积分。这样,我无需更改每个子集合中的数据量。我只是选择合适的访客,而最终的答案是无论得到多少国家,州或者城市。
- 游客
- 访客Wiki
史蒂夫·耶格(Steve Yegge)写了一篇(很长)有关解释器模式的博客文章,声称该模式是唯一可以使代码"更小"的GoF模式,并且被程序员充分利用,否则他们对其他GoF模式非常满意。我是从未使用过Interpreter模式的程序员之一,尽管我意识到它对DSL之类的东西很重要。无论如何,如果我们有肠胃的毅力阅读整篇Yegge文章,那将是一个非常发人深省的文章。
访客声誉不好,部分是由于一些实际问题
- Vistor和访问的层次结构之间的循环依赖性
- 它应该通过暴露Visited类的内部来破坏封装
部分是由于GOF书中的阐述,该书强调结构的遍历,而不是向封闭的层次结构添加虚拟功能。
这意味着在适当的情况下不会考虑它,例如解决静态类型语言中的双重调度问题。示例:C ++中的消息或者事件传递系统,其中消息的类型是固定的,但是我们希望通过添加新的收件人来扩展。在这里,消息只是结构,所以我们不在乎封装它们。 " SendTo()"不知道"消息"或者"消息接收者"是哪种类型。
#include <iostream> #include <ostream> using namespace std; // Downside: note the cyclic dependencies, typically expressed in // real life as include file dependency. struct StartMessage; struct StopMessage; class MessageRecipient { public: // Downside: hard to add new messages virtual void handleMessage(const StartMessage& start) = 0; virtual void handleMessage(const StopMessage& stop) = 0; }; struct Message { virtual void dispatchTo(MessageRecipient& r) const = 0; }; struct StartMessage : public Message { void dispatchTo(MessageRecipient& r) const { r.handleMessage(*this); } // public member data ... }; struct StopMessage : public Message { StopMessage() {} void dispatchTo(MessageRecipient& r) const { r.handleMessage(*this); } // public member data ... }; // Upside: easy to add new recipient class RobotArm : public MessageRecipient { public: void handleMessage(const StopMessage& stop) { cout << "Robot arm stopped" << endl; } void handleMessage(const StartMessage& start) { cout << "Robot arm started" << endl; } }; class Conveyor : public MessageRecipient { public: void handleMessage(const StopMessage& stop) { cout << "Conveyor stopped" << endl; } void handleMessage(const StartMessage& start) { cout << "Conveyor started" << endl; } }; void SendTo(const Message& m, MessageRecipient& r) { // magic double dispatch m.dispatchTo(r); } int main() { Conveyor c; RobotArm r; SendTo(StartMessage(), c); SendTo(StartMessage(), r); SendTo(StopMessage(), r); }
如果说的是非GOF模式,那么Monitor Object是并发OO编程的" Hello World"。令我惊讶的是,有多少程序员设法不听说它,或者更喜欢设计自己的临时同步方案。