Поставить другим способом:
Какие хорошие/полезные шаблоны дизайна, которые я, или кто-то другой, у кого есть знакомые основные шаблоны, могут и не знать?
Какие шаблоны проектирования недоиспользуются?
Ответ 1
Стив Егг написал (обычно) длинную запись о шаблоне интерпретатора , утверждая, что этот шаблон является единственным шаблоном GoF, который может сделать код "меньшим", и его недостаточно использовать программистами, которые в противном случае вполне согласны с другими шаблонами GoF. Я один из тех программистов - я никогда не использовал шаблон Interpreter, хотя я считаю его важным для таких вещей, как DSL. Во всяком случае, это очень продуманное эссе, если у вас есть стойкость кишечника, чтобы прочитать весь пост Йегге.Ответ 2
Возможно, шаблон стратегии? Я вижу, что многие люди не используют его, и это очень полезно, когда расчеты меняются или могут накапливаться вместе. Я использую его, когда часть вычисления может быть заменена другим вычислением. Часто в программе, которая использует для корпоративного тарифа для продукта.
Вот несколько документов:
Ответ 3
У посетителей плохой репутации, отчасти из-за некоторых реальных проблем
- циклическая зависимость между Vistor и посещенными иерархиями
- он должен разрушить инкапсуляцию, подвергая внутренним внутренним классам
и частично из-за изложения в книге GOF, в которой подчеркивается обход структуры, а не добавление виртуальных функций в замкнутую иерархию.
Это означает, что он не рассматривается, если это необходимо, например, для решения проблемы двойной отправки в статически типизированных языках. Пример: система передачи сообщений или событий на С++, где типы сообщений фиксированы, но мы хотим расширить их, добавив новых получателей. Здесь сообщения - это просто структуры, поэтому нам не нужно их инкапсулировать. SendTo()
не знает, какой тип Message
или MessageRecipient
имеет.
#include <iostream>
#include <ostream>
using namespace std;
// Downside: note the cyclic dependencies, typically expressed in
// real life as include file dependency.
struct StartMessage;
struct StopMessage;
class MessageRecipient
{
public:
// Downside: hard to add new messages
virtual void handleMessage(const StartMessage& start) = 0;
virtual void handleMessage(const StopMessage& stop) = 0;
};
struct Message
{
virtual void dispatchTo(MessageRecipient& r) const = 0;
};
struct StartMessage : public Message
{
void dispatchTo(MessageRecipient& r) const
{
r.handleMessage(*this);
}
// public member data ...
};
struct StopMessage : public Message
{
StopMessage() {}
void dispatchTo(MessageRecipient& r) const
{
r.handleMessage(*this);
}
// public member data ...
};
// Upside: easy to add new recipient
class RobotArm : public MessageRecipient
{
public:
void handleMessage(const StopMessage& stop)
{
cout << "Robot arm stopped" << endl;
}
void handleMessage(const StartMessage& start)
{
cout << "Robot arm started" << endl;
}
};
class Conveyor : public MessageRecipient
{
public:
void handleMessage(const StopMessage& stop)
{
cout << "Conveyor stopped" << endl;
}
void handleMessage(const StartMessage& start)
{
cout << "Conveyor started" << endl;
}
};
void SendTo(const Message& m, MessageRecipient& r)
{
// magic double dispatch
m.dispatchTo(r);
}
int main()
{
Conveyor c;
RobotArm r;
SendTo(StartMessage(), c);
SendTo(StartMessage(), r);
SendTo(StopMessage(), r);
}
Ответ 4
Шаблон посетителя, как представляется, трудно понять для многих новых разработчиков. Я использовал его для исчисления, когда у меня была возможность получить значение для Country > State > City > House. Таким образом, мне не нужно изменять количество данных в каждой подсети. Я просто выбираю правильного посетителя, и окончательный ответ получал все количество стран, штатов или городов.
Ответ 5
Если мы говорим о шаблонах, отличных от GOF, то Объект монитора является "Hello World" параллельного программирования OO. Я поражен тем, сколько программистов не знают об этом, или предпочитают создавать собственные схемы специальной синхронизации.