MediatorPattern.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person;
  5. class Mediator {
  6. public:
  7. virtual void Send(const string& msg, Person* person) = 0;
  8. virtual ~Mediator() { }
  9. void BuildRelation(Person *a, Person *b) {
  10. m_a = a;
  11. m_b = b;
  12. }
  13. protected:
  14. Person *m_a;
  15. Person *m_b;
  16. };
  17. class ConcreteMediator :public Mediator {
  18. public:
  19. void Send(const string& msg, Person* person) {
  20. if (person == m_a) {
  21. cout << msg << "--Mediator--PersonB" << endl;
  22. }
  23. else if (person == m_b) {
  24. cout << msg << "--Mediator--PersonA" << endl;
  25. }
  26. }
  27. };
  28. class Person {
  29. public:
  30. Person(Mediator*md):_md(md) { }
  31. virtual void SendMessage(const string& msg) = 0;
  32. virtual ~Person() { }
  33. protected:
  34. Mediator* _md;
  35. };
  36. class ConcretePersonA :public Person {
  37. public:
  38. ConcretePersonA(Mediator* md):Person(md) { }
  39. void SendMessage(const string& msg) {
  40. _md->Send(msg, this);
  41. }
  42. };
  43. class ConcretePersonB :public Person {
  44. public:
  45. ConcretePersonB(Mediator* md):Person(md) { }
  46. void SendMessage(const string& msg) {
  47. _md->Send(msg, this);
  48. }
  49. };
  50. int main() {
  51. Mediator *mediator = new ConcreteMediator();
  52. Person *personA = new ConcretePersonA(mediator);
  53. Person *personB = new ConcretePersonB(mediator);
  54. mediator->BuildRelation(personA, personB);
  55. personA->SendMessage("PersonA");
  56. personB->SendMessage("PersonB");
  57. delete personA;
  58. delete personB;
  59. delete mediator;
  60. return 0;
  61. }