Služebník (návrhový vzor)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Služebník (anglicky Servant) je návrhový vzor využívaný v objektově orientovaném programování. Tento vzor řeší problém, kdy potřebujeme definovat společnou funkčnost pro instance více tříd současně, přičemž tyto třídy nemohou mít společného rodiče, kam bychom definici této funkčnosti umístili.

Motivace[editovat | editovat zdroj]

Návrhový vzor Služebník využijeme v případě, když:

  • Několik tříd potřebuje definovat stejnou činnost a nechceme definovat na několika místech stejný kód
  • Objekt má úkol, který naprogramovat buď neumíme, nebo bychom jej sice zvládli, ale víme, že je úloha již naprogramovaná jinde
  • Připravujeme řešení, které chceme definovat dostatečně obecné, aby je mohli používat všichni, kteří je budou v budoucnu potřebovat, a přitom nevíme, kdo budou ti potřební

Implementace vzoru[editovat | editovat zdroj]

Služebník nepracuje sám, ale komunikuje s obsluhovanými instancemi. Aby mohl instance bezproblémově obsluhovat, klade na ně požadavky, co všechno musejí obsluhované instance umět

Služebník:

  • Definuje rozhraní, v němž deklaruje své požadavky na obsluhované instance
  • Metody služebníka pak budou akceptovat instance tohoto rozhraní jako své parametry

Instance, která chce být obsloužena:

  • Implementuje příslušné rozhraní, aby se mohla vydávat za jeho instanci. Implementací tohoto rozhraní deklaruje, že umí to, co od ní služebník k její plnohodnotné obsluze požaduje.

Terminologie[editovat | editovat zdroj]

V následujícím popisu jsou použity termíny:

  • klient – objekt, který něco požaduje po obsluhovaných objektech.
  • služebník – objekt, který nabízí nějakou službu objektům, implementujícím rozhraní IObsluhovaný
  • IObsluhovaný – rozhraní, jehož implementaci vyžaduje služebník od obsluhovaných objektů
  • obsluhovaný – Objekt, který implementuje rozhraní IObsluhovaný a je proto schopen být obsluhován služebníkem.

Možná použití[editovat | editovat zdroj]

Návrhový vzor Služebník používám ve dvou drobně odlišných situacích.

Služebníka zná obsluhovaný objekt[editovat | editovat zdroj]

V prvním případě Klient posílá Obsluhovanému zprávu se svým požadavkem. Obsluhovaný neumí nebo nechce na zprávu reagovat sám, a proto si 'pozve' Služebníka, který mu pomůže požadovanou funkci realizovat, a předá se jeho metodě jako parametr. Klient' přitom vůbec nemusí vědět, že Obsluhovaný' použil služeb Služebníka'.

Služebníka zná klient[editovat | editovat zdroj]

V druhém případě Klient ví, že Obsluhovaný objekt implementuje rozhraní IObsluhovaný a že klientem požadovanou službu umí splnit Služebník. Zavolá proto Služebníka sám a předá mu Obsluhovaný objekt jako parametr. Obsluhovaný v tomto případě vůbec nemusí vědět, že je předáván jako parametr některé z metod Služebníka a že je následně obsluhován Služebníkem.

Podobné návrhové vzory[editovat | editovat zdroj]

Návrhový vzor Služebník je velmi podobný vzoru Command (Příkaz). Architektura je stejná, liší se pouze posloupností úvah architekta aplikace.

Literatura[editovat | editovat zdroj]


Externí odkazy[editovat | editovat zdroj]