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