2008-09-24 20 views
11

Sıklıkla kullandığınız, ancak başka insan tasarımlarında kullanıldığını görebileceğiniz özel bir Gang Of Four Design Pattern var mı? Mümkünse, lütfen bu kalıbın yararlı olabileceği basit bir örneği açıklayın. Mutlaka bir Dörtlü Çete modeli olmak zorunda değilsiniz, ancak GoF olmayan bir desen seçtiyseniz lütfen desenin açıklamasına bir köprü ekleyin.
bazı iyi/yararlı tasarım desenleri I veya ana desen geçen bir bilgi var başkası zaten ne bilmiyor olabilir gibidir:Hangi tasarım desenleri yetersiz kullanılabilir?

Başka bir deyişle?

cevap

5

Strateji paterni belki? Bunu kullanan bir çok insan görmüyorum ve hesaplamalar değiştiğinde veya birlikte biriktirilebildiğinde oldukça yararlıdır. Hesaplamanın bir kısmı başka bir hesaplama ile değiştirilebiliyorsa kullanıyorum. Genellikle ürün için kurumsal ücret için kullanılan programda.

4

Ziyaretçi desen birçok yeni geliştiriciler için anlaşılması zor gibi görünüyor: Burada

bazı belgeler olduğunu. Ülke> Devlet> Şehir> Ev için değer elde etme imkanı bulduğumda hesabı için kullanıyordum. Bu şekilde, her alt koleksiyonda kaç tane verinin bulunduğunu değiştirmem gerekmiyor. Sadece doğru ziyaretçiyi seçiyorum ve final cevabı, ülke, ülke veya şehir sayısı ne olursa olsun.

8

Steve Yegge bir (genellikle) uzun blog entry about the Interpreter Pattern, bu model kodu "küçük" yapabilir sadece GoF desen, ve bu, hak talebinde bulunan cezai atıl olduğu yazdı Aksi takdirde diğer GoF modelleri ile oldukça rahat olan programcılar tarafından. Bu programcılardan biriyim - DSL'ler gibi şeylere önem verdiğimi bilmeme rağmen yorumlayıcı modelini hiç kullanmadım. Her neyse, bütün Yegge yazılarını okumak için intestinal bir güce sahip olmanız çok düşündürücü bir deneme.

5

Ziyaretçi kısmen

    o ziyaret etti sınıfları açarak kapsülleme bozmak gerekiyordu
  • Vistor ve Ziyaret hiyerarşileri arasında
  • döngüsel bağımlılık kısmen

ve iç yapıları bazı gerçek sorunlara, kötü bir üne sahiptir kapalı bir hiyerarşiye sanal işlevler eklemek yerine bir yapının geçişini vurgulayan GOF kitabındaki sergiden dolayı. Bu, uygun olduğunda, örneğin, statik olarak yazılan dillerde çift gönderim sorununu çözmek için dikkate alınmadığı anlamına gelir. Örnek: İleti türlerinin sabit olduğu C++ 'da bir ileti veya olay geçirme sistemi, ancak yeni alıcılar ekleyerek genişletmek istiyoruz. Burada mesajlar sadece yapıdır, bu yüzden onları içine almayı umursamıyoruz. SendTo(), Message veya MessageRecipient'un ne tür olduğunu bilmiyor.

#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

biz olmayan GOF desenleri konuşuyorsak o zaman Monitor Object eşzamanlı OO programlama 'Merhaba Dünya' dir. Kaç programcının bunu duymamayı beceremediğini veya kendi özel senkronizasyon planlarını tasarlamayı tercih ettiğimi hayret ediyorum.

İlgili konular