आगंतुक आंशिक रूप से कुछ वास्तविक समस्याओं
- यह देखा गया कक्षाएं उजागर द्वारा कैप्सूलीकरण बर्बाद करने के लिए चाहिए था Vistor और देखा गया पदानुक्रम के बीच
- चक्रीय निर्भरता internals
और आंशिक रूप से की वजह से, एक बुरा प्रतिष्ठा है जीओएफ पुस्तक में प्रदर्शनी के कारण, जो एक बंद पदानुक्रम में आभासी कार्यों को जोड़ने के बजाय संरचना के ट्रैवर्सल पर जोर देती है।
इसका मतलब है कि यह उचित रूप से टाइप की गई भाषाओं में डबल प्रेषण समस्या को हल करने के लिए उचित नहीं माना जाता है। उदाहरण: सी ++ में एक संदेश या घटना उत्तीर्ण प्रणाली, जहां संदेशों के प्रकार तय किए जाते हैं, लेकिन हम नए प्राप्तकर्ताओं को जोड़कर विस्तार करना चाहते हैं। यहां, संदेश केवल structs हैं, इसलिए हम उन्हें encapsulating के बारे में परवाह नहीं है। 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);
}