Aktivní objekt - Active object
The aktivní objekt návrhový vzor odděluje provádění metody od vyvolání metody pro objekty, které každý z nich vlastní vlákno kontroly.[1] Cílem je představit konkurence, používáním asynchronní vyvolání metody a a plánovač pro vyřizování žádostí.[2]
Vzor se skládá ze šesti prvků:[3]
- A proxy, který poskytuje rozhraní vůči klientům s veřejně přístupnými metodami.
- Rozhraní, které definuje požadavek na metodu na aktivním objektu.
- Seznam nevyřízených požadavků od klientů.
- A plánovač, který rozhodne, který požadavek bude proveden jako další.
- Implementace metody aktivního objektu.
- A zpětné volání nebo proměnná aby klient obdržel výsledek.
Příklad
Jáva
Příklad vzoru aktivního objektu v Jáva.[4]
Nejprve můžeme vidět standardní třídu, která poskytuje dvě metody, které nastavují double jako určitou hodnotu. Tato třída ano NE odpovídat vzoru aktivního objektu.
třída Moje třída { soukromé dvojnásobek val = 0.0; prázdnota dělej něco() { val = 1.0; } prázdnota doSomethingElse() { val = 2.0; }}
Třída je ve scénáři s více podprocesy nebezpečná, protože obě metody lze volat současně, takže hodnota val (která není atomová - aktualizuje se v několika krocích) by mohla být nedefinovaná - klasická podmínka závodu. K vyřešení tohoto problému můžete samozřejmě použít synchronizaci, což je v tomto triviálním případě snadné. Jakmile se však třída stane realisticky složitou, synchronizace může být velmi obtížná. [5]
Chcete-li přepsat tuto třídu jako aktivní objekt, můžete provést následující:
třída MyActiveObject { soukromé dvojnásobek val = 0.0; soukromé Blokovací fronta<Spustitelný> Expediční fronta = Nový LinkedBlockingQueue<Spustitelný>(); veřejnost MyActiveObject() { Nový Vlákno (Nový Spustitelný() { @ Přepis veřejnost prázdnota běh() { zatímco (skutečný) { Snaž se { Expediční fronta.vzít().běh(); } chytit (Přerušená výjimka E) { // dobře, stačí ukončit dispečera } } } } ).Start(); } prázdnota dělej něco() hodí Přerušená výjimka { Expediční fronta.dát(Nový Spustitelný() { @ Přepis veřejnost prázdnota běh() { val = 1.0; } } ); } prázdnota doSomethingElse() hodí Přerušená výjimka { Expediční fronta.dát(Nový Spustitelný() { @ Přepis veřejnost prázdnota běh() { val = 2.0; } } ); }}
Java 8 (alternativní)
Další příklad aktivního vzoru objektu v Javě místo toho implementovaný v Javě 8 poskytující kratší řešení.
veřejnost třída Moje třída { soukromé dvojnásobek val; // kontejner pro úkoly // rozhodne, který požadavek bude proveden jako další // asyncMode = true znamená, že naše pracovní vlákno zpracovává svoji lokální frontu úkolů v pořadí FIFO // pouze jeden podproces může změnit vnitřní stav soukromé finále ForkJoinPool fj = Nový ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory, nula, skutečný); // implementace metody aktivního objektu veřejnost prázdnota dělej něco() hodí Přerušená výjimka { fj.vykonat(() -> { val = 1.0; }); } // implementace metody aktivního objektu veřejnost prázdnota doSomethingElse() hodí Přerušená výjimka { fj.vykonat(() -> { val = 2.0; }); }}
Viz také
Reference
- ^ Douglas C. Schmidt; Michael Stal; Hans Rohnert; Frank Buschmann (2000). Softwarová architektura orientovaná na vzory, svazek 2: Vzory pro souběžné a síťové objekty. John Wiley & Sons. ISBN 0-471-60695-2.
- ^ Bass, L., Clements, P., Kazman, R. Softwarová architektura v praxi. Addison Wesley, 2003
- ^ Lavender, R. Greg; Schmidt, Douglas C. "Aktivní objekt" (PDF). Archivovány od originál (PDF) dne 22. 7. 2012. Citováno 2007-02-02.
- ^ Holub, Allen. „Aktivní objekty Java - návrh“. Archivovány od originál dne 22.06.2013. Citováno 2014-06-16.
- ^ Holub, Allen. „Aktivní objekty Java - návrh“. Archivovány od originál dne 22.06.2013. Citováno 2014-06-16.
externí odkazy
- Vysoce výkonný middleware založený na aktivním objektu Disruptor v C ++ 14
- Implementace aktivních objektů v C ++ 11
![]() | Tento programování související článek je a pahýl. Wikipedii můžete pomoci pomocí rozšiřovat to. |