Відвідувач (шаблон проєктування)

Відвідувач (Visitor) — шаблон проєктування, який дозволяє відділити певний алгоритм від елементів, на яких алгоритм має бути виконаний, таким чином можливо легко додати або ж змінити алгоритм без зміни елементів системи. Практичним результатом є можливість додавання нових операцій в існуючі структури об'єкта без зміни цих структур.

Відвідувач дозволяє додавати нові віртуальні функції в родинні класи без зміни самих класів, натомість, один відвідувач створює клас, який реалізує всі відповідні спеціалізації віртуальної функції. Відвідувач приймає посилання на елемент й реалізується шляхом подвійної диспетчеризації.

Проблема, яку вирішує

Над кожним об'єктом деякої структури виконується одна або більше операцій. Визначити нову операцію, не змінюючи класи об'єктів.

Випадки застосування

Шаблон Відвідувач використовується, коли:

  • існує багато об'єктів різних класів з різними інтерфейсами, і потрібно виконати операцію над цими об'єктами, залежно від їх типу.
  • потрібно виконувати над об'єктами багато не пов'язаних між собою операцій, але не хочеться "забруднювати" цими операціями класи об'єктів. При цьому, якщо ці об'єкти використовуються у декількох проєктах, з'являється можливість включати операції лише в ті проєкти, де вони необхідні.
  • класи, які визначають структуру даних, змінюються рідко, але є потреба часто визначати нові операції над цією структурою. Якщо ж класи, які визначають структуру даних, змінюються часто, краще визначити операції в цих класах, адже при зміні інтерфейсів у класі даних необхідно змінювати і класи, які реалізують операції над цією структурою.
  • треба визначити операцію над деякою структурою, не змінюючи клас цієї структури.

Опис шаблону

Основним призначенням шаблону Відвідувач є введення абстрактної функціональності для сукупної ієрархічної структури об'єктів «елемент», а саме, шаблон Відвідувач дає змогу, не змінюючи класи елементів, додавати в них нові операції. Для цього вся обробна функціональність переноситься з самих класів елементів в ієрархію спадкування Відвідувача.

Шаблон відвідувач дає змогу легко додавати нові операції — потрібно просто додати новий похідний від відвідувача клас. Однак, шаблон Відвідувач слід використовувати тільки в тому випадку, якщо підкласи елементів сукупної ієрархічної структури залишаються стабільними (незмінними). В іншому випадку, потрібно докласти значних зусиль на оновлення всієї ієрархії.

Іноді наводяться заперечення з приводу використання шаблону Відвідувач, оскільки він розділяє дані та алгоритми, що суперечить концепції об'єктно-орієнтованого програмування. Однак успішний досвід застосування STL, де поділ даних і алгоритмів покладено в основу, доводить можливість використання Відвідувача.


Реалізація

Особливості шаблону

Частини шаблону

  • Відвідувач (зазвичай, абстрактний клас чи інтерфейс)
    • визначає дію над кожним класом конкретних елементів. Ім'я та сигнатура операції мають визначати конкретний клас даних, елемент якого треба відвідати. Це дає можливість відвідувачу доступатися до елементів через інтерфейс конкретного класу.
  • Конкретний відвідувач (конкретний клас, що наслідує Відвідувач)
    • реалізує чи перевизначає операції, визначені в базовому класі. Містить алгоритми, які виконуватимуться над об'єктами відповідного класу. Також даний клас утримує локальний стан алгоритмів (цей стан, зазвичай, утримує проміжні результати під час обходу структури, та ін.).
  • Елемент (зазвичай, абстрактний клас чи інтерфейс)
    • визначає операцію, яка приймає об'єкт відвідувача як аргумент.
  • Конкретний елемент (конкретний клас, що наслідує Елемент)
    • визначає операцію, що приймає об'єкт відвідувача як аргумент.
  • Структура елементів (клас, що реалізує структуру елементів)
    • може перераховувати елементи, які містить.
    • надає високорівневий інтерфейс, що дозволяє відвідувачу виконувати елементи.
    • може бути Компонувальником чи колекцією (як список або черга).

Взаємодія

  • Клієнт, що використовує Відвідувача, має створити об'єкт Конкретного відвідувача та обійти потрібні елементи, відвідуючи кожен з них цим об'єктом.
  • Коли елемент відвідується, він викликає операцію Відвідувача, що відповідає класу елементу. Елемент передає себе як аргумент в цю операцію щоб дозволити Відвідувачу доступ до його стану, якщо це необхідно.

Переваги

  • спрощується додавання нових операцій;
  • об'єднання споріднених операції в класі Visitor;
  • клас Visitor може запам’ятовувати в собі якийсь стан під час обходу контейнера.

Недоліки

  • важке додавання нових класів, оскільки потрібно оновлювати ієрархію відвідувачів.

Приклади реалізації

C++

С#

Java

Див. також

Посилання

Read other articles:

Ford Ranger (T6)InformasiProdusenFord Motor CompanyMasa produksi2011–sekarangPerakitanRayong, Thailand (AAT)Silverton, South Africa Buenos Aires, Argentina (Ford Argentina)Bodi & rangkaKelasTruk pikapBentuk kerangka2-door single cab2-door extended cab4-door double cabTata letakMesin depan, penggerak roda belakang/4WDMobil terkaitMazda BT-50JMC YuhuPenyalur dayaMesin2.5 L Duratec 25 I4 (bensin)2.2 L Duratorq I4 (diesel)3.2 L Duratorq I5 (diesel)Transmisi5-speed manual6-speed automat...

 

Danau VlasinaDanau VlasinaLetakSerbia TenggaraKoordinat42°42′N 22°20′E / 42.700°N 22.333°E / 42.700; 22.333Koordinat: 42°42′N 22°20′E / 42.700°N 22.333°E / 42.700; 22.333Jenis perairanwadukAliran keluar utamaSungai VlasinaTerletak di negaraSerbiaPanjang maksimal105 km (65 mi)Lebar maksimal35 km (22 mi)Area permukaan16 km2 (6,2 sq mi)Kedalaman rata-rata103 m (338 ft)Kedalaman maksimal34...

 

Revolusi Islam IranProtes di alun-alun Azadi, Teheran, 1979Tanggal7 Januari 1978 – 11 Februari 1979LokasiIranHasil Kemenangan Dewan Revolusi Kejatuhan Shāh Mohammed Rezā Pahlavi Berakhirnya Dinasti Pahlavi Dibentuknya Republik Islam Iran Krisis energi 1979 Perang Iran–IrakPihak terlibat Negara Imperial Iran SAVAK Garda Imperial Iran Republik Islam Iran Dewan Revolusi IranTokoh dan pemimpin Mohammad Reza Pahlavi Ayatollah Ruhollah Khomeini Mehdi BazarganBagian dari seri mengenai Sejarah ...

American Biotechnology Company Intuitive Surgical, Inc.Company typePublicTraded asNasdaq: ISRGNasdaq-100 componentS&P 500 componentIndustryMedical Appliances & EquipmentFounded1995; 29 years ago (1995)HeadquartersSunnyvale, California, U.S.Key peopleGary S. Guthart(CEO)Dave Rosa(President)Lonnie M. Smith(Chairman)Productsda Vinci Surgical SystemRevenue US$6.22 billion (2022)Operating income US$1.58 billion (2022)Net income US$1.32 billion (2022)Total assets US$1...

 

Psamtik I[1]PsammetichusRelief Psamtik I sedang mengantarkan persembahan kepada Ra-HorakhtyFiraunMasa pemerintahan664 – 610 SM (Dinasti ke-26)PendahuluNekho IPenggantiNekho IIGelar kerajaan Prenomen  (Praenomen) Wahibre Nomen Psamtik Nama Horus Aaib Nama Nebty Neba Horus emas Qenu PasanganMehtenweskhet[2]AnakNekho II, Nitocris IIbuRatu IstemabetMeninggal610 SMMakamSais Psamtik I (juga dieja Psammeticus atau Psammetichus, dalam bahasa Yunani: Ψαμμήτιχος), adala...

 

Computer-based generation of digital images This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: 2D computer graphics – news · newspapers · books · scholar · JS...

Election for the Governor of Nevada 1982 Nevada gubernatorial election ← 1978 November 2, 1982 (1982-11-02) 1986 →   Nominee Richard Bryan Robert List Party Democratic Republican Popular vote 128,132 100,104 Percentage 53.3% 41.6% County resultsBryan:      40–50%      50–60%      60–70%List:      40–50%      50–60...

 

ХристианствоБиблия Ветхий Завет Новый Завет Евангелие Десять заповедей Нагорная проповедь Апокрифы Бог, Троица Бог Отец Иисус Христос Святой Дух История христианства Апостолы Хронология христианства Раннее христианство Гностическое христианство Вселенские соборы Н...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Ballonet – news · newspapers · books · scholar · JSTOR (May 2021) (Learn how and when to remove this message) Air-filled bags inside the envelope of an airship The air-filled red balloon acts as a simple ballonet inside the outer balloon, which is filled with l...

Taulant Xhaka CSKA Moscow versus Basel, 2017Informasi pribadiNama lengkap Taulant Ragip XhakaTanggal lahir 28 Maret 1991 (umur 33)Tempat lahir Basel, SwissTinggi 172 m (564 ft 4 in)Posisi bermain BekInformasi klubKlub saat ini BaselNomor 34Karier junior2000–2002 Concordia Basel2002–2009 BaselKarier senior*Tahun Tim Tampil (Gol)2008–2010 Basel U21 50 (6)2010– Basel 85 (3)2012–2013 → Grasshopper (pinjaman) 38 (0)Tim nasional‡2008–2009 Swiss U-17 14 (0)2009�...

 

NFL team season 1995 Tampa Bay Buccaneers seasonOwnerMalcolm GlazerGeneral managerRich McKayHead coachSam WycheHome fieldTampa StadiumResultsRecord7–9Division place5th NFC CentralPlayoff finishDid not qualifyTeam MVPMLB Hardy Nickerson ← 1994 Buccaneers seasons 1996 → The 1995 Tampa Bay Buccaneers season was the franchise's 20th season in the National Football League (NFL). The season began with the team trying to improve on a 6–10 season in 1994, a season in wh...

 

УсадьбаБольшие Горки 55°30′17″ с. ш. 37°45′52″ в. д.HGЯO Страна  Россия Местоположение Горки Ленинские Статус  Объект культурного наследия народов РФ федерального значения. Рег. № 501420777940006 (ЕГРОКН). Объект № 5010232000 (БД Викигида)  Медиафайлы на Викискладе Об �...

Neolithic henge monument Goseck CircleSonnenobservatorium GoseckA view inside the reconstructed wooden palisade of the circleLocation in GermanyLocationGoseck, Saxony-AnhaltTypeCircular EnclosureDiameter75 metersHistoryFoundedca. 4900 B.C.PeriodsNeolithicSite notesDiscovered1991Excavation dates2002-2005ConditionreconstructedPublic accessyes The Goseck Circle (German: Sonnenobservatorium Goseck) is a Neolithic structure in Goseck in the Burgenlandkreis district in Saxony-Anhalt, Germ...

 

This article is about the chemical element. For other uses, see Uranium (disambiguation). Chemical element, symbol U and atomic number 92Uranium, 92UUraniumPronunciation/jʊˈreɪniəm/ ​(yuu-RAY-nee-əm)Appearancesilvery gray metallic; corrodes to a spalling black oxide coat in airStandard atomic weight Ar°(U)238.02891±0.00003[1]238.03±0.01 (abridged)[2] Uranium in the periodic table Hydrogen Helium Lithium Beryllium Boron Carbon Nitrogen Oxygen Fl...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: List of mayors of Louisville, Kentucky – news · newspapers · books · scholar · JSTOR (January 2024) (Learn how and when to remove this message) Mayor of Louisville, KentuckyIncumbentCraig Greenbergsince January 2, 2023Formation1828First holderJohn Bucklin...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Fripp Island, South Carolina – news · newspapers · books · scholar · JSTOR (June 2013) (Learn how and when to remove this message) Census-designated place in South Carolina, United StatesFripp IslandCensus-designated placeBeaufort County, South CarolinaCountry...

 

この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?: 本庄早稲田駅 – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL(2010年12月) 本庄早稲田駅 北口(2006年11月) ほんじょ�...

 

Village in Warmian-Masurian Voivodeship, PolandKadynyVillageMaiolica factoryKadynyCoordinates: 54°17′52″N 19°29′17″E / 54.29778°N 19.48806°E / 54.29778; 19.48806Country PolandVoivodeshipWarmian-MasurianCountyElblągGminaTolkmickoPopulation(approx.)600Time zoneUTC+1 (CET) • Summer (DST)UTC+2 (CEST)Vehicle registrationNEB Kadyny [kaˈdɨnɨ] is a village of Gmina Tolkmicko, within Elbląg County, Warmian-Masurian Voivodeship, in northern Pola...

Serie A 1965-1966I campioni dell'Olimpia MilanoDettagli della competizioneSport Pallacanestro Edizione44ª OrganizzatoreFIP Federazione FIP Squadre12 VerdettiCampione Olimpia Milano(17º titolo) Retrocessioni Partenope Stella Azzurra Non ammesse allastagione successiva Sant'Agostino Miglior marcatore Doug Moe Cronologia della competizioneed. successiva →     ← ed. precedente Modifica dati su Wikidata · Manuale Il campionato Serie A 196...

 

Maria SavitskayaInformationsNom court Мария СавицкаяNaissance 22 avril 1991 (33 ans)ToulaNationalité russeÉquipes UCI 2013RusVelo7.2014-2014RusVelomodifier - modifier le code - modifier Wikidata Maria Savitskaya-Mishina, née le 22 avril 1991 à Toula, est une coureuse cycliste russe spécialiste de la piste. Biographie Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ? Palmarès sur piste Championnats...