SORU
31 EKİM 2008, Cuma


Ziyaretçi Tasarım Deseni kullanmalıyım?

Bloglar ziyaretçi desen başvurular görüyorum ama itiraf etmeliyim ki, ben anlamıyorum. wikipedia article for the pattern okudum ve kendi mekaniğini anlıyorum ama yine de kullanmak istiyorum ne zaman kafam karıştı.

Sadece son zamanlarda gerçekten çok çalışan biri olarakvardekoratör desen ve şimdi bunun için kullandığı gerçekten anlamak istiyorum kesinlikle her yerde görmektir sezgisel görünüşte kullanışlı bu model de.

CEVAP
1 Kasım 2008, CUMARTESİ


Ziyaretçi desen çok aşina değilim. Bakalım eğer doğru anladıysam bakın. Hayvanların bir hiyerarşi olduğunu varsayalım

class Animal {  };
class Dog: public Animal {  };
class Cat: public Animal {  };

(Karmaşık bir hiyerarşi olduğunu iyi kurulmuş bir arayüz ile varsayalım.)

Şimdi hiyerarşiye yeni bir işlem eklemek istiyorum, yani her hayvanın sesi yapmak istiyorum. Hiyerarşi bu basit olarak, düz polimorfizmi ile yapabilecekleriniz:

class Animal
{ public: virtual void makeSound() = 0; };

class Dog : public Animal
{ public: void makeSound(); };

void Dog::makeSound()
{ std::cout << "woof!\n"; }

class Cat : public Animal
{ public: void makeSound(); };

void Cat::makeSound()
{ std::cout << "meow!\n"; }

Ama bu şekilde devam etmeden, her zaman hiyerarşinin her bir sınıf için arayüz değiştirmeniz gerekir bir işlemi eklemek istediğiniz. Şimdi, özgün arayüz memnun olduğunu ve mümkün olan en az sayıda değişiklik yapmak istediğiniz yerine varsayalım.

Ziyaretçi desen sana uygun bir sınıfta her yeni operasyon taşımak için izin verir, ve hiyerarşi arayüzü sadece bir kez silin. Yapalım. İlk olarak, hiyerarşi içinde her sınıf için bir yöntem olan "" GoF sınıf) Ziyaretçi: . (soyut bir işlemi tanımlamak

class Operation
{
public:
    virtual void hereIsADog(Dog *d) = 0;
    virtual void hereIsACat(Cat *c) = 0;
};

O zaman, biz yeni bir operasyon kabul edilebilmesi için " hiyerarşisini değiştirmek:

class Animal
{ public: virtual void letsDo(Operation *v) = 0; };

class Dog : public Animal
{ public: void letsDo(Operation *v); };

void Dog::letsDo(Operation *v)
{ v->hereIsADog(this); }

class Cat : public Animal
{ public: void letsDo(Operation *v); };

void Cat::letsDo(Operation *v)
{ v->hereIsACat(this); }

Son olarak, gerçek işlemi uygulamakne Kedi ne de Köpek değiştirmeden:

class Sound : public Operation
{
public:
    void hereIsADog(Dog *d);
    void hereIsACat(Cat *c);
};

void Sound::hereIsADog(Dog *d)
{ std::cout << "woof!\n"; }

void Sound::hereIsACat(Cat *c)
{ std::cout << "meow!\n"; }

Şimdi artık hiyerarşi değiştirmeden işlemleri eklemek için bir yol var. İşte nasıl çalıştığı:

int main()
{
    Cat c;
    Sound theSound;
    c.letsDo(&theSound);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009
  • Thom Hall

    Thom Hall

    24 Kasım 2006