Az adapter tervezési minta akkor lesz igazán hasznos számunkra, ha különböző komponensekkel dolgozunk és ezek a komponensek eltérő interfésszel rendelkeznek. Az adapterek lehetővé teszik, hogy ezek az interfészek összekapcsolhatóak legyenek egymással anélkül, hogy meg kellene változtatni a meglévő kódot.
A bevezetőből adódhat a kérdés, hogy egyáltalán miért rendelkeznek a szoftverünkben a komponensek különböző interfészekkel és miért nem egységesek? Ennek számos oka lehet, de talán a leggyakoribb az, hogy egy külső komponenst kell beépítenünk a programunkba, aminek a felépítése radikálisan eltér a mi szoftverünk belső felépítésétől.
Ebben az esetben két lehetőségünk van: vagy átstrukturáljuk a programunkat, hogy illeszkedjünk a külső komponenshez, vagy készítünk egy komponenst, ami adaptálja a komponens kódját a mi alkalmazásunk felépítéséhez.
Az utóbbi opció szerencsésebb választás, mivel nem biztos, hogy csak egy külső komponensünk lesz és kivitelezhetetlen, vagy minimum sok időt igényelne egy olyan felépítés tervezése a programunkba, ami minden komponenshez megfelel.
Nézzünk egy példa implementációt:
public interface IRequestHandler
{
string Handle();
}
public sealed class SomeRequestHandler
{
public string HandleRequest(string path)
{
return $"Handling request for {path}...";
}
}
public class RequestHandlerAdapter : IRequestHandler
{
private readonly SomeRequestHandler _toBeAdapted;
public RequestHandlerAdapter(SomeRequestHandler toBeAdapted)
{
_toBeAdapted = toBeAdapted;
}
public string Handle()
{
return _toBeAdapted.HandleRequest("http://localhost");
}
}
A példában a fogyasztó az IRequestHandler interfészt tudja használni, a SomeRequestHandler osztály pedig az adaptálandó osztályunkat jelképezi. A RequestHandlerAdapter osztály pedig a tényleges adapter implementációnk, ami implementálja a SomeRequestHandler interfészt. Az adapter Handle() metódusa pedig adaptálja a hívást úgy, hogy a SomeRequestHandler metódusa a megfelelő paraméterrel hívódjon meg.
Előnyök
- Követi a Single Responsibility elvet
- Követi az Open/Closed elvet
Hátrányok
- Növeli a kód komplexitását. Néha kézenfekvőbb a kód átírása, mint adapterek bevezetése