fork download
  1.  
  2. #include <iostream>
  3.  
  4.  
  5.  
  6. class Visitor{
  7. public:
  8. virtual ~Visitor(){}
  9. virtual void visitModelA(class ModelA*) = 0;
  10. virtual void visitModelB(class ModelB*) = 0;
  11. //add visit functions for later defined models
  12.  
  13. };
  14.  
  15.  
  16.  
  17.  
  18.  
  19. class View{
  20. public:
  21. virtual ~View(){}
  22. };
  23.  
  24. class ViewA : public View{
  25. public:
  26. ViewA(){
  27. std::cout << "Created ViewA\n";
  28. }
  29. };
  30.  
  31.  
  32. class ViewB : public View{
  33. public:
  34. ViewB(){
  35. std::cout << "Created ViewB\n";
  36. }
  37. };
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46. class Model{
  47. public:
  48. virtual ~Model(){}
  49.  
  50. virtual void Accept(Visitor* visitor) = 0;
  51.  
  52. };
  53.  
  54. class ModelA:public Model{
  55. public:
  56.  
  57. virtual void Accept(Visitor* visitor){
  58. visitor->visitModelA(this);
  59. }
  60. };
  61.  
  62. class ModelB:public Model{
  63. public:
  64. virtual void Accept(Visitor* visitor){
  65. visitor->visitModelB(this);
  66. }
  67. };
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74. // ViewCreator can be made a private class of ViewFactory
  75. class ViewCreator : public Visitor{
  76. public:
  77. virtual void visitModelA(class ModelA*) {
  78. _view = new ViewA();
  79. }
  80. virtual void visitModelB(class ModelB*) {
  81. _view = new ViewB();
  82. }
  83.  
  84. //add visit functions for later defined models
  85.  
  86. View* GetView(){
  87. return _view;
  88. }
  89.  
  90. private:
  91. View* _view;
  92. };
  93.  
  94.  
  95. class ViewFactory{
  96. public:
  97. static View* CreateViewFor( Model* model){
  98. ViewCreator viewCreator;
  99. model->Accept(&viewCreator);
  100. return viewCreator.GetView();
  101. }
  102.  
  103. };
  104.  
  105.  
  106. int main(){
  107.  
  108. ModelA modelA;
  109. View* viewA = ViewFactory::CreateViewFor(&modelA);
  110.  
  111.  
  112. ModelB modelB;
  113. View* viewB = ViewFactory::CreateViewFor(&modelB);
  114.  
  115.  
  116.  
  117. }
  118.  
Success #stdin #stdout 0.01s 2856KB
stdin
Standard input is empty
stdout
Created ViewA
Created ViewB