2/3 паттернов - это частный подвид общего паттерна
class A[: B]
{
ptr<C> m_c; //либо:
std::vector<ptr<C> > m_c;
//где ptr - либо в-одиночку-владеющий_ptr, либо shared_ptr, либо weak_ptr
[virtual] [ptr][D | void] Foo()
{
[if (m->Q) | while (m->R)]
[for each]m_c->Bar();
}
}; |
_Winnie C++ Colorizer |
Вообщем, любое можно взять синтаксическое дерево, порождающее класс, и обозвать его "паттерном".
Все эти паттерны плавно и непрерывно друг в друга перетекают и являются вырождеными/общими случаями друг друга.
Имхо, все остальные паттерны можно назвать частным случаем паттерна "стратегия". Просто иногда стратегии сложные. А иногда очень простые. А иногда их много. А иногда ни одной. А иногда метод Foo чуточку сложнее. А иногда кто-то кого-то создаёт.
Или бывает, что класс параметризуют самим себя(или суперклассом) - "прокси", "цепочка обязанностей", "composite", "забыл-как-называется-про-рамочку-вокруг-о
кна-добавление-функциональности"
Или вообще-то он параметризуются, но пользователю этого делать не дают - "Фасад".
Единственная ценность - обсуждение проблем и преимуществ в каждом конкретном случае. Просто интересная делёжка опытом, "а если сделать так, то вот такие грабли".
Нафиг их "называть" как-то? Их же как и чисел, очень много. А паттернов "Pi", "E", "0", "1" я не вижу. Вижу только "666", "747"(боинг), "2005".
Кроме основных понятий "объект", "(виртуальный)метод", "указатель", "интерфейс", "создание объектов" и тп.
И главного guideline - "разделяейте обязанности, минимизуруйте зависимости".
Единственное, что как-то сильно у меня в голове выбивается из этой схемы и что я сходу вспомнил - это "Итератор". А остальное - частные случаи стратегий.