Adaptér
Adaptér umožňuje spolupráci třídám, které by vzhledem k rozdílným rozhraním jinak nespolupracovaly. Způsob, jakým tohoto účelu dosáhnout, spočívá ve vložení třídy adaptéru mezi tyto 2 třídy.
Příkladem z reálného života je adaptér do zásuvek. Pojedete-li do jiné země, tak tam velmi pravděpodobně narazíte na zásuvky, které mají jiný tvar a jiné napětí. Z tohoto důvodu je zapotřebí vložit mezi zařízení a zásuvku adaptér, který zajistí jak vhodné napětí, tak samotnou možnost zapojení (kvůli tvaru zásuvky).
Adapter je třída, která zajišťuje funkcionalitu systému, ale neimplementuje požadované rozhraní. Rozhraní, které očekává třída Client, je definované v abstraktní třídě Target. Tato třída slouží jako předek pro konkrétní třídu Adapter, která má za úkol transformovat volání od klienta na příslušné metody tříd typu Adaptee.
Existují dvě možná řešení tohoto návrhového vzoru v jazyce Java. První je založen na odvození nové třídy od staré nevyhovující a přidání metod, které zajistí implementaci požadovaného rozhraní. Toto řešení je nazýváno třídní (class) adapter a využívá dědičnosti. Naproti tomu objektový (object) adapter využívá principu vložení reference na třídy Adaptee do Adapteru a delegování požadavků na metody Adaptee objektu. V takovém případě může jeden Adapter zajišťovat komunikaci s více objekty.
Využití
Adapter slouží k zajištění propojenosti tříd, aby pracovaly v komplexním programu. Je využíván, jestliže je nutné přizpůsobit chování již vytvořených tříd a zajistit jejich vzájemnou komunikaci bez nutnosti měnit existujících rozhraní.
Další možností je zajištění zpřehlednění složitého rozhraní, které je implementováno výchozí třídou. Přes třídu Adapter je potom odstíněna konkrétní implementace vytvořené třídy. Object adapter je využíván, jestliže chceme zajistit použití instancí několika existujících tříd. V takové situaci může být výhodné vytvořit třídu, která komunikuje se všemi adaptovanými a nevyužívat principu dědění nové třídy z výchozí.