哪些设计模式未得到充分利用?
是否有我们经常使用的特定的"四人一组设计模式",却很少在其他人的设计中使用?如果可能,请描述一个简单的示例,其中该模式可能有用。它不一定必须是"四人一组"模式,但是如果我们选择非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"。令我惊讶的是,有多少程序员设法不听说它,或者更喜欢设计自己的临时同步方案。

