Какие шаблоны проектирования недоиспользуются?

Существует ли специфицированный "Набор из четырех шаблонов дизайна" , который вы часто используете, но вряд ли видите, что он используется в проектах других народов? Если возможно, опишите простой пример, где этот шаблон может быть полезен. Он не обязательно должен быть шаблоном Gang Of Four, но, пожалуйста, укажите гиперссылку на описание паттерна, если вы выберете шаблон без GoF.

Поставить другим способом:
Какие хорошие/полезные шаблоны дизайна, которые я, или кто-то другой, у кого есть знакомые основные шаблоны, могут и не знать?

Ответ 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. Я поражен тем, сколько программистов не знают об этом, или предпочитают создавать собственные схемы специальной синхронизации.