Návrhový vzor Active Object patří do skupiny návrhových vzorů pro paralelní programování. Odděluje volání metody od vlastního provedení metody. Typickou situací pro jeho použití je, když je třeba z jednoho vlákna (či více vláken) volat metody objektu, který běží v jiném (svém vlastním) vláknu, tedy volat je asynchronně a zároveň zajistit, aby byly provedeny ve správném pořadí a ve správné chvíli – tj. když nastanou podmínky umožňující jejich spuštění.

Použití editovat

Tento návrhový vzor je vhodné použít, když z různých vláken chceme volat metody jednoho objektu tak, aby tyto metody nezdržovaly nebo nezastavovaly běh těchto vláken, a zároveň chceme mít možnost ovlivňovat pořadí, v jakém objekt metody „zpracuje“ a samozřejmě se při tom vyhnout konfliktům jako race condition nebo deadlock.

Struktura editovat

Active Object využívá šesti tříd: Proxy, Scheduler, Activation List, Servant, Method Request a Future.

Proxy editovat

Proxy skrývá a odděluje celou implementaci Active Objectu od zbytku programu – vláken-klientů, které volají metody poskytované Active Objectem. Po zavolání metody klientem skrze Proxy tato vytvoří Method Request (požadavek na metodu), který představuje v zásadě použití návrhového vzoru Příkaz (Command), a zavolá příslušnou metodu objektu Scheduler pro zařazení požadavku do aktivačního seznamu (Activation List).

Method Request editovat

Třída Method Request je abstraktní třída, pro každou konkrétní poskytovanou metodu je vytvořen potomek této třídy. Scheduler ukládá požadavky do aktivačního seznamu a zjišťuje, která metoda z aktivačního seznamu může být zrovna spuštěna – tj. splňuje požadavky, které jsou součástí Method Requestu. Požadavky pak spouští pomocí objektu Servant, který v sobě skrývá implementaci jednotlivých metod.

Vracení výsledku editovat

Pokud metoda má vrátit nějaký výsledek, vrací Proxy objekt Future, do kterého je později, po vykonání příslušné metody, tento výsledek uložen.

Příklad z reálného života editovat

Analogií z reálného života může být práce číšníka a kuchaře v restauraci: číšníka si můžeme představit jako Proxy – sbírá požadavky od klientů – hostů a předává je kuchaři, vytváří z požadavků seznam – Activation List. Kuchař pak požadavky zpracovává v takovém pořadí, aby optimálně využil své zdroje (plotny, pánve, hrnce atd.)

Literatura editovat

  • Douglas C. Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann "Pattern-Oriented Software Architecture, Volume 2, Patterns for Concurrent and Networked Objects", Wiley, 2000