Одноразовий відвідувач (англ. Single-serving visitor) — шаблон поведінки. Призначений для оптимізації роботи шаблону відвідувач (Visitor). Використовується лише один раз, після закінчення всіх операцій він видаляється(у більшості випадків).
Використання
Цей шаблон поведінки є особливим випадком використання паттерна «відвідувач», тому його потрібно застосовувати у певних особливих випадках, таких як:
- В програмі має бути тільки один екземпляр такого відвідувача. В певних випадках можна реалізувати такого відвідувача, як одинака. При цьому можна бути впевненим, що відвідувач може бути викликаний пізніше без змін параметрів.
- Він є особливим випадком реалізації паттерна «відвідувач», тож він також описує операцію, яка виконується над об'єктами інших класів, він може виконати ті ж самі функції, що і у випадку звичайного паттерну «відвідувач», але після виконання ним заданих функцій він видаляється.
- Після виконання певної операції програми, не потрібно щоб відвідувачі залишитися в пам'яті. Це часто трапляється при відвідуванні великої кількості об'єктів, або ієрархії (наприклад, коли шаблон відвідувач використовується разом з шаблоном Компоновщик) для виконання одного завдання на ньому.
- Шаблон регулярного відвідувача слід використовувати, коли відвідувач повинен залишитися в пам'яті. Це потрібно для того щоб встановити відвідувачем ряд налаштувань, які будуть збережені в пам'яті для пізнього використання відвідувачем.
Приклади використання
Паттерн одноразового відвідувача викликається через проміжні слої статичних методів
Реалізація на
Без параметрів:
Element* elem; SingleServingVisitor::apply_to(elem);
З параметрами:
Element* elem; TYPE param1, param2; SingleServingVisitor::apply_to(elem, param1, param2);
Реалізація на C#
Без параметрів:
public static Element elem; SingleServingVisitor.apply_to(elem);
З параметрами:
public static Element elem; public static TYPE param1 = new TYPE(); public static TYPE param2 = new TYPE(); SingleServingVisitor.apply_to(elem, param1, param2);
Наслідки
Переваги
- Відвідувачі викликаються при необхідності і можуть знищуватися без будь-якої шкоди. Тим самим не створюючи "зомбованих об'єктів"
- Відвідувач створюється, використовується і знищується від єдиного виклику певного статичного методу який був для цього призначений.
Недоліки
- Є істотний недолік у тому, що одноразовий відвідувач при виклику певного методу, він спочатку створюється, а потім знищується, це непродуктивна операція, яка забирає достатньо велику кількість часу.
Передавання параметрів
Якщо одноразовий відвідувач був ініціалізований, то параметри повинні передаватися через статичний метод:
Реалізація на C++
void SingleServingVisitor::apply_to(Element* elem, TYPE param1, TYPE param2, ...) { SingleServingVisitor ssv(param1, param2, ...); elem.accept(&ssv); }
Реалізація на C#
public partial class SingleServingVisitor { public void apply_to(Element elem, TYPE param1, TYPE param2, ... ) { SingleServingVisitor ssv = new SingleServingVisitor(param1, param2, ...); elem.accept(ssv); } }
Використання як одинака (singleton)
Така реалізація забезпечує:
- Не більше одного екземпляра самообслуговуючого відвідувача
- Доступ до відвідувача може бути надано пізніше
Реалізація на C++
// Призначення class SingleServingVisitor { protected: static SingleServingVisitor* instance_; TYPE param1_; TYPE param2_; SingleServingVisitor(); static SingleServingVisitor* get_instance(); // Зауваження: метод get_instance не повинен бути публічним public: ~SingleServingVisitor(); static void apply_to(Element*); //статичні методи для доступу до параметрів static void set_param1(TYPE); static void set_param2(TYPE); virtual void visit_ElementA(ElementA*) = 0; virtual void visit_ElementB(ElementB*) = 0; } // Реалізація SingleServingVisitor* SingleServingVisitor::instance_ = NULL; SingleServingVisitor* SingleServingVisitor::get_instance() { if (this->instance_ == NULL) this->instance_ = new SingleServingVisitor(); return this->instance_; } void SingleServingVisitor::apply_to(Element* elem) { elem->accept(get_instance()); } void SingleServingVisitor::set_param1(TYPE param1) { getInstance()->param1_ = param1; } void SingleServingVisitor::set_param2(TYPE param2) { getInstance()->param2_ = param2; }
Реалізація на C#
// Призначення public abstract class SingleServingVisitor { protected static SingleServingVisitor instance_ = null; protected TYPE param1_ = new TYPE(); protected TYPE param2_ = new TYPE(); // Реалізація protected static SingleServingVisitor get_instance() { if (this.instance_ == null) this.instance_ = new SingleServingVisitor(); return this.instance_; } // Зауваження: метод get_instance не повинен бути публічним SingleServingVisitor(); public static void apply_to(Element elem) { elem.accept(get_instance()); } //статичні методи для доступу до параметрів public static void set_param1(TYPE param1) { getInstance().param1_ = param1; } public static void set_param2(TYPE param2) { getInstance().param2_ = param2; } public abstract void visit_ElementA(ElementA NamelessParameter); public abstract void visit_ElementB(ElementB NamelessParameter); }
Ця стаття не містить . (вересень 2013) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Odnorazovij vidviduvach angl Single serving visitor shablon povedinki Priznachenij dlya optimizaciyi roboti shablonu vidviduvach Visitor Vikoristovuyetsya lishe odin raz pislya zakinchennya vsih operacij vin vidalyayetsya u bilshosti vipadkiv VikoristannyaCej shablon povedinki ye osoblivim vipadkom vikoristannya patterna vidviduvach tomu jogo potribno zastosovuvati u pevnih osoblivih vipadkah takih yak V programi maye buti tilki odin ekzemplyar takogo vidviduvacha V pevnih vipadkah mozhna realizuvati takogo vidviduvacha yak odinaka Pri comu mozhna buti vpevnenim sho vidviduvach mozhe buti viklikanij piznishe bez zmin parametriv Vin ye osoblivim vipadkom realizaciyi patterna vidviduvach tozh vin takozh opisuye operaciyu yaka vikonuyetsya nad ob yektami inshih klasiv vin mozhe vikonati ti zh sami funkciyi sho i u vipadku zvichajnogo patternu vidviduvach ale pislya vikonannya nim zadanih funkcij vin vidalyayetsya Pislya vikonannya pevnoyi operaciyi programi ne potribno shob vidviduvachi zalishitisya v pam yati Ce chasto traplyayetsya pri vidviduvanni velikoyi kilkosti ob yektiv abo iyerarhiyi napriklad koli shablon vidviduvach vikoristovuyetsya razom z shablonom Komponovshik dlya vikonannya odnogo zavdannya na nomu Shablon regulyarnogo vidviduvacha slid vikoristovuvati koli vidviduvach povinen zalishitisya v pam yati Ce potribno dlya togo shob vstanoviti vidviduvachem ryad nalashtuvan yaki budut zberezheni v pam yati dlya piznogo vikoristannya vidviduvachem Prikladi vikoristannyaPattern odnorazovogo vidviduvacha viklikayetsya cherez promizhni sloyi statichnih metodiv Realizaciya na C Bez parametriv Element elem SingleServingVisitor apply to elem Z parametrami Element elem TYPE param1 param2 SingleServingVisitor apply to elem param1 param2 Realizaciya na C Bez parametriv public static Element elem SingleServingVisitor apply to elem Z parametrami public static Element elem public static TYPE param1 new TYPE public static TYPE param2 new TYPE SingleServingVisitor apply to elem param1 param2 NaslidkiPerevagi Vidviduvachi viklikayutsya pri neobhidnosti i mozhut znishuvatisya bez bud yakoyi shkodi Tim samim ne stvoryuyuchi zombovanih ob yektiv Vidviduvach stvoryuyetsya vikoristovuyetsya i znishuyetsya vid yedinogo vikliku pevnogo statichnogo metodu yakij buv dlya cogo priznachenij Nedoliki Ye istotnij nedolik u tomu sho odnorazovij vidviduvach pri vikliku pevnogo metodu vin spochatku stvoryuyetsya a potim znishuyetsya ce neproduktivna operaciya yaka zabiraye dostatno veliku kilkist chasu Peredavannya parametriv Yaksho odnorazovij vidviduvach buv inicializovanij to parametri povinni peredavatisya cherez statichnij metod Realizaciya na C void SingleServingVisitor apply to Element elem TYPE param1 TYPE param2 SingleServingVisitor ssv param1 param2 elem accept amp ssv Realizaciya na C public partial class SingleServingVisitor public void apply to Element elem TYPE param1 TYPE param2 SingleServingVisitor ssv new SingleServingVisitor param1 param2 elem accept ssv Vikoristannya yak odinaka singleton Taka realizaciya zabezpechuye Ne bilshe odnogo ekzemplyara samoobslugovuyuchogo vidviduvacha Dostup do vidviduvacha mozhe buti nadano piznishe Realizaciya na C Priznachennya class SingleServingVisitor protected static SingleServingVisitor instance TYPE param1 TYPE param2 SingleServingVisitor static SingleServingVisitor get instance Zauvazhennya metod get instance ne povinen buti publichnim public SingleServingVisitor static void apply to Element statichni metodi dlya dostupu do parametriv static void set param1 TYPE static void set param2 TYPE virtual void visit ElementA ElementA 0 virtual void visit ElementB ElementB 0 Realizaciya SingleServingVisitor SingleServingVisitor instance NULL SingleServingVisitor SingleServingVisitor get instance if this gt instance NULL this gt instance new SingleServingVisitor return this gt instance void SingleServingVisitor apply to Element elem elem gt accept get instance void SingleServingVisitor set param1 TYPE param1 getInstance gt param1 param1 void SingleServingVisitor set param2 TYPE param2 getInstance gt param2 param2 Realizaciya na C Priznachennya public abstract class SingleServingVisitor protected static SingleServingVisitor instance null protected TYPE param1 new TYPE protected TYPE param2 new TYPE Realizaciya protected static SingleServingVisitor get instance if this instance null this instance new SingleServingVisitor return this instance Zauvazhennya metod get instance ne povinen buti publichnim SingleServingVisitor public static void apply to Element elem elem accept get instance statichni metodi dlya dostupu do parametriv public static void set param1 TYPE param1 getInstance param1 param1 public static void set param2 TYPE param2 getInstance param2 param2 public abstract void visit ElementA ElementA NamelessParameter public abstract void visit ElementB ElementB NamelessParameter Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno veresen 2013