是否有经常使用的特定的四人组设计模式,但在其他人的设计中几乎没有使用过?如果可能,请描述一个简单的示例,其中此模式可能很有用.它不一定是Gang of Four模式,但如果您选择非GoF模式,请包含指向模式描述的超链接.
换句话说:
我或其他人对主要模式有所了解的一些好的/有用的设计模式可能还不知道?
访客声誉不佳,部分原因是一些真正的问题
部分是由于GOF书中的阐述,强调遍历结构而不是将虚函数添加到封闭的层次结构中.
这意味着在适当的情况下不会考虑它,例如用于解决静态类型语言中的双重调度问题.示例:在C++中传递系统的消息或事件,其中消息的类型是固定的,但我们希望通过添加新的收件人来扩展.这里,消息只是结构,所以我们不关心封装它们.SendTo()
不知道是什么类型Message
或MessageRecipient
有什么.
#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);
}
Run Code Online (Sandbox Code Playgroud)