2008-09-24 5 views
11

Есть ли specfic Gang Of Four Design Pattern, который вы часто используете, но вряд ли видите, что используется в других проектах народов? Если возможно, опишите простой пример, где этот шаблон может быть полезен. Он не обязательно должен быть шаблоном Gang Of Four, но, пожалуйста, укажите гиперссылку на описание шаблона, если вы выберете шаблон без GoF.Какие шаблоны проектирования недостаточно используются?

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

ответ

5

Возможно, шаблон стратегии? Я вижу, что не очень много людей используют его, и это очень полезно, когда расчеты меняются или могут накапливаться вместе. Я использую его, когда часть вычисления может быть заменена другим вычислением. Часто в программе, которая используется для корпоративного тарифа для продукта.

Вот некоторая документация:

4

Узор посетителей, кажется, трудно понять, для многих новых разработчиков. Я использовал его для исчисления, когда у меня была возможность получить значение для Country> State> City> House. Таким образом, мне не нужно изменять количество данных в каждой подсети. Я просто выбираю правильного посетителя, и окончательный ответ получал сколько угодно стран, штатов или городов.

8

Стив Yegge писал (обычно) долго blog entry about the Interpreter Pattern, что делает утверждение, что эта модель является единственным модель GoF, что может сделать код «меньше», и преступно недоиспользованными программистами, которые в противном случае вполне согласны с другими шаблонами GoF. Я один из тех программистов - я никогда не использовал шаблон Interpreter, хотя я считаю его важным для таких вещей, как DSL. Во всяком случае, это очень продуманное эссе, если у вас есть стойкость в кишечнике, чтобы прочитать весь пост Йегге.

5

Посетитель имеет плохую репутацию, отчасти из-за некоторых реальных проблем

  • циклическую зависимость между Vistor и посетил иерархий
  • он должен разрушить инкапсуляцию, подвергнув Посещенные классы Internals

и частично из-за изложения в книге GOF, в которой подчеркивается обход структуры, а не добавление виртуальных функций в закрытую иерархию.

Это означает, что это не рассматривается, если это необходимо, например, для решения проблемы с двойной отправкой в ​​статически типизированных языках. Пример: система передачи сообщений или событий на C++, где типы сообщений фиксированы, но мы хотим расширить их, добавив новых получателей. Здесь сообщения - это просто структуры, поэтому нам не нужно их инкапсулировать. 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); 
} 
2

Если мы говорим модели, не GOF то Monitor Object является «Hello World» параллельного программирования OO. Я поражен тем, как многие программисты не слышали об этом или предпочитают разрабатывать собственные схемы специальной синхронизации.

Смежные вопросы