2008-09-24 15 views
11

Czy jest jakiś konkretny model, którego często używasz, ale rzadko widzi się go w projektach innych ludzi? Jeśli to możliwe, opisz prosty przykład, gdzie ten wzór może być przydatny. Nie musi to być koniecznie wzór Gang Of Four, ale proszę dołączyć hiperłącze do opisu wzoru, jeśli wybierzesz wzór bez FF.Które wzorce są niedostatecznie wykorzystane?

Innymi słowy:
Jakie są dobre/użyteczne wzorce projektowe, że ja, czy ktoś inny, kto ma wiedzę mijania głównych wzorców, nie może już znasz?

Odpowiedz

5

Może wzór strategii? Nie widzę wielu osób, które go używają i jest to całkiem przydatne, gdy obliczenia zmieniają się lub mogą być gromadzone razem. Używam go, gdy część obliczeń można zastąpić innymi obliczeniami. Często w programie, który wykorzystuje stawkę korporacyjną dla produktu.

Oto dokumentacja:

4

odwiedzający wydaje się być trudne do zrozumienia dla wielu nowych twórców. Używałem go do obliczeń, gdy miałem możliwość uzyskania wartości dla kraju> Stan> Miasto> Dom. W ten sposób nie muszę zmieniać liczby danych w każdym pobranym zbiorze. Po prostu wybieram odpowiedniego gościa, a ostateczną odpowiedź otrzymałem niezależnie od liczby krajów, stanów lub miast.

8

Steve Yegge napisał (typowo) długo blog entry about the Interpreter Pattern, co twierdzenie, że ten wzór jest tylko wzór GoF które mogą uczynić kod "mniejszy", i jest karnej niewykorzystane przez programistów, którzy inaczej czują się dobrze z innymi wzorcami GoF. Jestem jednym z tych programistów - nigdy nie użyłem wzorca tłumacza, choć zdaję sobie sprawę, że ma on znaczenie dla takich rzeczy jak DSL. W każdym razie, jest to bardzo prowokujący esej, jeśli masz siłę jelit do przeczytania całego wpisu Jegge.

5

Visitor ma złą reputację, częściowo z powodu pewnych realnych problemów

  • cykliczną zależność między Vistor i odwiedził hierarchii
  • to miało zniszczyć hermetyzacji wystawiając Odwiedzone klas wewnętrzne

i częściowo ze względu na ekspozycję w książce GOF, która kładzie nacisk na przechodzenie przez strukturę, zamiast dodawać funkcje wirtualne do zamkniętej hierarchii.

Oznacza to, że nie jest brane pod uwagę w razie potrzeby, np. W celu rozwiązania problemu podwójnej wysyłki w językach statycznie napisanych. Przykład: system przekazywania komunikatów lub zdarzeń w C++, w którym typy wiadomości są stałe, ale chcemy rozszerzyć, dodając nowych odbiorców. W tym przypadku wiadomości są po prostu strukturami, więc nie zależy nam na ich enkapsulacji. SendTo() nie wie, jaki typ ma Message lub 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

Jeśli mówimy wzory non-GOF następnie Monitor Object jest 'Hello World' z równoczesnym programowaniu obiektowym. Jestem zaskoczony, jak wielu programistów udaje się nie słyszeć o tym, lub woli zaprojektować własne schematy synchronizacji ad hoc.

Powiązane problemy