![]() |
Adapter | ||
За примерами адаптеров далеко ходить не нужно — достаточно взглянуть на адаптеры STL-контейнеров. Например, std::stack. Назначение адаптеров — ограничить функциональность существующей сущности, добавить дополнительные проверки, внести какие-то ограничения и так далее, получив тем самым новую концептуальную сущность. | ||
Я приведу совсем простой пример. Создадим контейнер, который хранит по дням количество часов, отработанных сотрудником за неделю. Логично предположить, что ежедневное количество часов должно быть неотрицательным и не превышать 24. Кроме того, в неделю сотрудник работает неотрицательное число дней, в то же время количество дней не должно превышать 7. |
0 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 | #include <vector> template < template < class T, class allocator = std::allocator<T> > class container > class week_sheet { public: bool push_back(int hours) { if(hours < 0 || hours > 24 || week.size() == 7) { return false; } week.push_back(hours); return true; } bool pop_back() { if(week.empty()) { return false; } week.pop_back(); return true; } private: typedef container<int> hour_container; hour_container week; }; int main() { week_sheet<std::vector> ws; ws.push_back(7); ws.push_back(4); ws.push_back(5); ws.push_back(8); ws.push_back(6); return 0; } |
Итак, адаптер конкретизирует сущность, или адаптирует ее работу под конкретные условия. Адаптер — хороший паттерн. Правильная реализация адаптера позволяет полностью изолировать пользователя от адаптируемой функциональности. Если адаптируемая функциональность изменит свой интерфейс или какие-то другие свойства, то пользователь этого не заметит — достаточно будет просто поправить сам адаптер. |
|
Статистика |
|