Форум программистов, компьютерный форум CyberForum.ru

Шаблоны проектирования - C++

Восстановить пароль Регистрация
 
overlord754
54 / 16 / 5
Регистрация: 24.10.2009
Сообщений: 181
10.01.2014, 15:23     Шаблоны проектирования #1
Подскажите пожалуйста. Есть 2 задачи. На шаблон "Абстрактная фабрика" и шаблон "Команда".



1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
class ICar //AbstractProductA
{
public:
    virtual void printName() = 0;
    virtual ~ICar() {}
};
 
class Ford: public ICar //ConcreteProductA1
{
public:
    virtual void printName() 
    { 
        std::cout << "Ford" << std::endl; 
    }
};
 
class Toyota: public ICar // ConcreteProductA2
{
public:
    virtual void printName() 
    { 
        std::cout << "Toyota" << std::endl; 
    }
};
 
class Mersedes: public ICar // ConcreteProductA3
{
public:
    virtual void printName() 
    { 
        std::cout << "Mersedes" << std::endl; 
    }
};
 
class IEngine // AbstractProductB
{
public:
    virtual void printPower() = 0;
    virtual ~IEngine(){}
};
 
class FordEngine: public IEngine // ConcreteProductB1
{
public:
    virtual void printPower() 
    { 
        std::cout << "Ford Engine 4.4" << std::endl; 
    }
};
 
class ToyotaEngine: public IEngine // ConcreteProductB2
{
public:
    virtual void printPower() 
    { 
        std::cout << "Toyota Engine 3.2" << std::endl; 
    }
};
 
class MersedesEngine: public IEngine // ConcreteProductB2
{
public:
    virtual void printPower() 
    { 
        std::cout << "Mersedes Engine 3.5" << std::endl; 
    }
};
 
 
class IBus // AbstractProductC
{
public:
    virtual void printBusName() = 0;
    virtual ~IBus(){}
};
 
class FordBus: public IBus // ConcreteProductC1
{
public:
    virtual void printBusName() 
    { 
        std::cout << "Ford Bus" << std::endl; 
    }
};
 
class ToyotaBus: public IBus // ConcreteProductC2
{
public:
    virtual void printBusName() 
    { 
        std::cout << "Toyota Bus" << std::endl; 
    }
};
 
class MersedesBus: public IBus // ConcreteProductC2
{
public:
    virtual void printBusName() 
    { 
        std::cout << "Mersedes Bus" << std::endl; 
    }
};
 
 
class ICarFactory // AbstractFactory
{
public:
    virtual ICar*    createCar()    = 0;
    virtual IEngine* createEngine() = 0;    
    virtual IBus*    createBus()    = 0;
};
 
class FordFactory: public ICarFactory // ConcreteFactory1
{
public:
 
    virtual ICar* createCar() // from ICarFactory
    {
        return new Ford();
    }
 
    virtual IEngine* createEngine()
    {
        return new FordEngine();
    }
 
    virtual IBus* createBus()
    {
        return new FordBus();
    }
};
 
class ToyotaFactory: public ICarFactory // ConcreteFactory2
{
public:
    virtual ICar* createCar() // from ICarFactory
    {
        return new Toyota();
    }
 
    virtual IEngine* createEngine()
    {
        return new ToyotaEngine();
    }
 
    virtual IBus* createBus()
    {
        return new ToyotaBus();
    }
};
 
class MersedesFactory: public ICarFactory // ConcreteFactory2
{
public:
    virtual ICar* createCar() // from ICarFactory
    {
        return new Mersedes();
    }
 
    virtual IEngine* createEngine()
    {
        return new MersedesEngine();
    }
 
    virtual IBus* createBus()
    {
        return new MersedesBus();
    }
};
 
 
void use(ICarFactory* f)
{
    ICar*     myCar     =  f->createCar();
    IEngine*  myEngine  =  f->createEngine();
    IBus*     myBus     =  f->createBus();
 
    myCar->printName();
    myEngine->printPower();
    myBus->printBusName(); 
 
    delete myCar;
    delete myEngine;
    delete myBus;
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    ToyotaFactory toyotaFactory;
    FordFactory fordFactory;
    MersedesFactory mersedesFactory; 
 
    use (&toyotaFactory);
    use (&fordFactory);
    use (&mersedesFactory);
    
    getch();
 
    return 0;
}
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
class Document
{
   vector<string> data; 
public:
   void Insert( int line, const string & str )
   {
      if ( line <= data.size() )
         data.insert( data.begin() + line, str ); 
      else
         cout << "Error!" << endl; 
   }
 
   void Remove( int line )
   {
      if( !( line>data.size() ) )
         data.erase( data.begin() + line ); 
      else
         cout << "Error!" << endl; 
   }
 
   string & operator [] ( int x )
   {
      return data[x]; 
   }
 
   void Show()
   {
      for( int i = 0; i<data.size(); ++i )
      {
         cout << i + 1 << ". " << data[i] << endl; 
      }
   }
}; 
 
class Command
{
protected:
   Document * doc; 
public:
   virtual void Execute() = 0; 
   virtual void unExecute() = 0; 
 
   void setDocument( Document * _doc )
   {
      doc = _doc; 
   }
}; 
 
class InsertCommand : public Command
{
   int line; 
   string str; 
public:
   InsertCommand( int _line, const string & _str ): line( _line ), str( _str ) {}
 
   void Execute()
   {
      doc->Insert( line, str ); 
   }
 
   void unExecute()
   {
      doc->Remove( line ); 
   }
}; 
 
class Receiver
{
   vector<Command*> DoneCommands; 
   vector<Command*> UndoCommands; 
   Document doc; 
   Command* command;
public:
   void Insert( int line, string str )
   {
      command = new InsertCommand( line, str ); 
      command->setDocument( &doc ); 
      command->Execute(); 
      DoneCommands.push_back( command ); 
   }
 
   void Undo()
   {
      if( DoneCommands.size() == 0 )
      {
         cout << "There is nothing to undo!" << endl; 
      }
      else
      {
         command = DoneCommands.back(); 
         DoneCommands.pop_back();
         UndoCommands.push_back(command);
         command->unExecute();
      }
   }
 
   void Redo()
   {
      if( UndoCommands.size() == 0 )
      {
         cout << "There is nothing to redo!" << endl; 
      }
      else
      {
         command = UndoCommands.back();
         DoneCommands.push_back(command); 
         UndoCommands.pop_back();
         command->Execute();
      }
   }
 
 
   void Show()     
   {
      doc.Show(); 
   }
}; 
 
int _tmain(int argc, _TCHAR* argv[])
{
   char s = '1'; 
   int line, line_b, num_undo, num_redo;
   string str; 
   Receiver res; 
   while( s!= 'e' )
   {
      cout << "What to do: \n1.Add a line\n2.Undo last command\n3.Show document\n4.Undo any last command\n5.Redo command\n6.Redo any command" << endl; 
      cin >> s; 
      switch( s )
      {
      case '1':
         cout << "What line to insert: "; 
         cin >> line; 
         --line; 
         cout << "What to insert: "; 
         cin >> str; 
         res.Insert( line, str ); 
         break; 
      case '2':
         res.Undo(); 
         break; 
      case '3':
         cout << "---DOCUMENT---" << endl; 
         res.Show(); 
         cout << "***DOCUMENT***" << endl; 
         break; 
      case '4':
         cout << "How many Undo you need: "; 
         cin >> num_undo;
         for (int i=0; i<num_undo; ++i)
             res.Undo();
         break;
      case '5':
         res.Redo(); 
         break; 
      case '6':
         cout << "How many Redo you need: "; 
         cin >> num_redo;
         for (int i=0; i<num_redo; ++i)
             res.Redo();
         break;
       }
   }
 
    return 0;
}
Подскажите, правильно ли сделаны задачи на основе этих шаблонов. И как доделать 1-ю задачу чтобы было меню.
Миниатюры
Шаблоны проектирования   Шаблоны проектирования  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 15:23     Шаблоны проектирования
Посмотрите здесь:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Шаблоны проектирования C++
C++ Паттерн проектирования «Фасад»
C++ Методы проектирования по информационной безопасности
C++ Шаблоны проектирования (литература для изучения)
C++ Объектно-ориентированного проектирования и проектирования на основе структур данных
C++ Шаблоны проектирования при создании карт
Паттерны проектирования (Фабрики) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
overlord754
54 / 16 / 5
Регистрация: 24.10.2009
Сообщений: 181
10.01.2014, 18:43  [ТС]     Шаблоны проектирования #2
ну правильно или нет?
Убежденный
Системный программист
 Аватар для Убежденный
14173 / 6188 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
10.01.2014, 18:56     Шаблоны проектирования #3
А в чем смысл делать копи-паст примеров из Википедии ?
Yandex
Объявления
10.01.2014, 18:56     Шаблоны проектирования
Ответ Создать тему
Опции темы

Текущее время: 06:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru