Active Object

Z Wikipedie, otevřené encyklopedie

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 | editovat zdroj]

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 | editovat zdroj]

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

Proxy[editovat | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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