Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
# هدف اعمالی که باید روی عناصری از شیء اجرا شود را ارائه می‌کند. این الگو اجازه را می‌دهد تا اعمال جدیدی تعریف کنید بدون اینکه کلاس‌هایی که این اعمال روی آن‌ها انجام می‌شود را تغییر دهید.

ساختار

Visitor Pattern

نکات طراحی

مثال

فرض کنید سلسله مراتبی از ساختار حیوانات به صورت زیر داشته باشیم:

```c++ class Animal { }; class Dog : public Animal { }; class Cat : public Animal { }; ```
فرض کنید بخواهیم که عملیات جدیدی برای این سلسله مراتب تعیین کنیم تا هر حیوان صدای مخصوص به خود را ایجاد کند. با استفاده از پلی‌مورفیزم این کار را انجام می‌دهیم.
```c++ class Animal { public: virtual void makeSound() = 0; };

class Dog : public Animal { public: viod makeSound { cout << "woof!" << endl } };

class Cat : public Animal { public: void makeSound { cout << "meow!" << endl; } };

<div dir="rtl">
با این روش هر بار که بخواهیم رفتار جدیدی به این ساختار سلسله مراتبی اضافه کنیم مجبوریم هر یک از کلاس‌ها را تک تک تغییر دهیم. به کمک الگوی ویزیتور می‌توانیم از این ضعف طراحی جلوگیری کنیم:
<div dir="ltr">
```c++
class Operation;

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

class Cat;
class Dog;

class Operation {
public:
	virtual void catOperation( Cat* cat ) = 0;
	virtual void dogOperation( Dog* dog ) = 0;
};

class Sound : public Operation {
public:
	void dogOperation(Dog* dog ) {
		cout << "woof!" << endl;
	}

	void catOperation(Cat* cat ) {
		cout << "meow!" << endl;
	}
};

class Dog : public Animal {
public:
	void letsDo( Operation* op ) {
		op->dogOperation( this );
	}
};

class Cat : public Animal {
public:
	void letsDo( Operation* op ) {
		op->catOperation( this );
	}
};

int main() {

	Cat* cat = new Cat();
	Sound* sound = new Sound();
	cat->letsDo( sound );

	return 0;
}
مثال از اینجا: http://stackoverflow.com/a/255300/225052

مثال‌های واقعی

- javax.lang.model.element.AnnotationValue and AnnotationValueVisitor - javax.lang.model.element.Element and ElementVisitor - javax.lang.model.type.TypeMirror and TypeVisitor