是否有经常使用的特定的四人组设计模式,但在其他人的设计中几乎没有使用过?如果可能,请描述一个简单的示例,其中此模式可能很有用.它不一定是Gang of Four模式,但如果您选择非GoF模式,请包含指向模式描述的超链接.
换句话说:
我或其他人对主要模式有所了解的一些好的/有用的设计模式可能还不知道?
Steve Yegge撰写了一篇关于解释器模式的(通常)漫长的博客文章,声称这种模式是唯一可以使代码"更小"的GoF模式,并且由于程序员对其他GoF模式非常熟悉而未能充分利用这种模式. .我是那些程序员之一 - 我从来没有使用过Interpreter模式,虽然我认识到它对DSL之类的东西很重要.无论如何,这是一篇非常发人深省的文章,如果你有坚韧的阅读整个Yegge帖子.
战略模式可能吗?我看不到很多人使用它,当计算改变或可以累积在一起时它非常有用.当计算的一部分可以被另一个计算替换时,我使用它.通常在用于产品的企业费率的程序中.
这是一些文档:
维基百科
DoFactory
访客声誉不佳,部分原因是一些真正的问题
Vistor和Visited层次结构之间的循环依赖关系
它应该通过暴露Visited类内部来破坏封装
部分是由于GOF书中的阐述,强调遍历结构而不是将虚函数添加到封闭的层次结构中.
这意味着在适当的情况下不会考虑它,例如用于解决静态类型语言中的双重调度问题.示例:在C++中传递系统的消息或事件,其中消息的类型是固定的,但我们希望通过添加新的收件人来扩展.这里,消息只是结构,所以我们不关心封装它们.SendTo()
不知道是什么类型Message
或MessageRecipient
有什么.
#include#include 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); }