Jednorázový vzor návštěvníka - Single-serving visitor pattern
![]() | Téma tohoto článku nemusí splňovat požadavky Wikipedie obecný pokyn k notabilitě.Březen 2019) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v programování, jednorázový vzor návštěvníka je návrhový vzor. Jeho záměrem je optimalizovat implementaci a návštěvník který je přidělen, použit pouze jednou a poté odstraněn (což je případ většiny návštěvníků).
Použitelnost
Jednorázový vzor návštěvníka by měl být použit, když návštěvníci nepotřebují zůstat v paměti. To se často stává při návštěvě hierarchie objektů (například když vzor návštěvníka se používá společně s složený vzor ) provést na něm jeden úkol, například spočítat počet kamer ve 3D scéně.
Pravidelný vzor návštěvníka by měl být použit, když musí návštěvník zůstat v paměti. K tomu dochází, když je návštěvník nakonfigurován s řadou parametrů, které musí být uchovány v paměti pro pozdější použití návštěvníka (například pro uložení možností vykreslení 3D vykreslovače scén).
Pokud by však v celém programu měla být pouze jedna instance takového návštěvníka, může být dobrý nápad jej implementovat jak jako jednorázový návštěvník, tak jako jedináček. Přitom je zajištěno, že jednorázového návštěvníka lze později zavolat s nezměněnými parametry (v tomto konkrétním případě je „jednorázový návštěvník“ zneužitím jazyka, protože návštěvníka lze použít několikrát).
Příklady použití
Jeden sloužící návštěvník je volán prostředníkem statických metod.
- Bez parametrů:
Živel* elem; SingleServingVisitor::použít na(elem);
- S parametry:
Živel* elem; TYP param1, param2; SingleServingVisitor::použít na(elem, param1, param2);
- Implementace jako singleton:
Živel* elem; TYP param1, param2; SingleServingVisitor::set_param1(param1); SingleServingVisitor::set_param2(param2); SingleServingVisitor::použít na(elem);
Důsledky
Profesionálové
- Žádné „zombie“ objekty. U návštěvníka s jednou obsluhou je zajištěno, že jsou návštěvníci v případě potřeby přiděleni a zničeni, jakmile budou k ničemu.
- Jednodušší rozhraní než návštěvník. Návštěvník je vytvořen, používán a bezplatný jediným zavoláním použít na statická metoda.
Nevýhody
- Opakovaná alokace. Při každém volání použít na metodou je vytvořen návštěvník s jednou obsluhou, který je poté vyřazen, což je časově náročné. Naproti tomu singleton provádí pouze jednu alokaci.
Implementace (v C ++)
Základní implementace (bez parametrů)
// Prohlášenítřída Živel;třída ElementA;třída ElementB;třída SingleServingVisitor;... // Stejné jako u [[vzor návštěvníka]].// Definicetřída SingleServingVisitor {chráněný: SingleServingVisitor();veřejnost: ~SingleServingVisitor(); statický prázdnota použít na(Živel*); virtuální prázdnota visit_ElementA(ElementA*) = 0; virtuální prázdnota visit_ElementB(ElementB*) = 0;}// Implementaceprázdnota SingleServingVisitor::použít na(Živel* elem) { SingleServingVisitor ssv; elem.akceptovat(ssv);}
Předávání parametrů
Pokud musí být inicializován návštěvník s jednou obsluhou, musí být parametry předány statickou metodou:
prázdnota SingleServingVisitor::použít na(Živel* elem, TYP param1, TYP param2, ...) { SingleServingVisitor ssv(param1, param2, ...); elem.akceptovat(&ssv);}
Implementace jako singleton
Tato implementace zajišťuje:
- že existuje nanejvýš jedna instance jediného obsluhujícího návštěvníka
- že k návštěvníkovi lze přistupovat později
// Definicetřída SingleServingVisitor {chráněný: statický SingleServingVisitor* instance_; TYP param1_; TYP param2_; SingleServingVisitor(); statický SingleServingVisitor* get_instance(); // Poznámka: Metoda get_instance nemusí být veřejnáveřejnost: ~SingleServingVisitor(); statický prázdnota použít na(Živel*); // statické metody pro přístup k parametrům statický prázdnota set_param1(TYP); statický prázdnota set_param2(TYP); virtuální prázdnota visit_ElementA(ElementA*) = 0; virtuální prázdnota visit_ElementB(ElementB*) = 0;}// ImplementaceSingleServingVisitor* SingleServingVisitor::instance_ = NULA;SingleServingVisitor* SingleServingVisitor::get_instance() { -li (tento->instance_ == NULA) tento->instance_ = Nový SingleServingVisitor(); vrátit se tento->instance_;}prázdnota SingleServingVisitor::použít na(Živel* elem) { elem->akceptovat(get_instance());}prázdnota SingleServingVisitor::set_param1(TYP param1) { getInstance()->param1_ = param1;}prázdnota SingleServingVisitor::set_param2(TYP param2) { getInstance()->param2_ = param2;}
Související vzory
- Návštěvnický vzor, z čehož tento vzor pochází
- Složený vzor: jeden sloužící návštěvník se často používá pro hierarchie prvků
- Singleton vzor