Rad s uzorkom dizajna adaptera

Uzorci dizajna rješenja su za ponavljajuće probleme i složenosti u dizajnu softvera. Uzorci dizajna kategorizirani su kao kreativni, strukturni ili bihevioralni. Kreativni obrasci koriste se za stvaranje i upravljanje mehanizmom stvaranja instanci klasa. Strukturni obrasci koriste se za ostvarivanje odnosa među entitetima. Obrasci dizajna ponašanja bave se suradnjom objekata i delegiranjem odgovornosti.

Uzorak adaptera je uzorak strukturnog dizajna koji djeluje kao most između dva nespojiva sučelja. Pojam "adapter" koristi se za predstavljanje objekta koji omogućuje međusobno nespojiva sučelja za komunikaciju i suradnju. U osnovi, obrazac adaptera omogućuje da klase (koje imaju nekompatibilna sučelja) rade zajedno i njihovi objekti komuniciraju ako je potrebno.

Postoje određene vrste ispravljača koji implementiraju sučelja i cilja i prilagodnika. Takve vrste adaptera poznate su kao dvosmjerni adapteri. Također imate dvije različite vrste adaptora, naime, Class Adapters i Object Adapters. Dok prvi koristi nasljeđivanje, drugi koristi sastav kako bi riješio probleme s nekompatibilnošću u vašim dizajnom. Uzorak dizajna adaptera možete koristiti kada trebate koristiti biblioteku treće strane koja nije kompatibilna s vrstama koje imate u svojoj aplikaciji.

Slijedi popis tipova koji sudjeluju u tipičnoj implementaciji uzorka adaptera:

  • Cilj
  • Adapter
  • Prilagođeni
  • Klijent

Shvatimo to na primjeru. Pretpostavimo da dvoje ljudi koji govore i razumiju različite jezike trebaju komunicirati - jedan može biti francuski, a drugi njemački. Dakle, ove dvije osobe mogu govoriti i razumjeti samo francuski, odnosno njemački - ne obje. Obično vam treba netko (tumač) koji zna oba jezika kako bi olakšao komunikaciju. Dakle, osoba koja može olakšati ovu komunikaciju djeluje kao adapter.

Ovaj obrazac spada u strukturnu kategoriju, jer biste ga koristili za strukturiranje tipova u našoj aplikaciji - obično ovaj obrazac može transformirati jedno sučelje u drugo. Gang of Four definira obrazac adaptera kao "Pretvorite sučelje klase u drugo sučelje koje klijenti očekuju. Adapter omogućuje da klase rade zajedno što inače ne bi moglo zbog nekompatibilnih sučelja."

Idemo sada kopati po nekom kodu. Razmotrite sljedeće dvije klase.

public class TargetA

            {

                public void DisplayA()

                {

                    Console.WriteLine("TargetA");

                }

            }

            public class TargetB

            {

                public void DisplayB()

                {

                    Console.WriteLine("TargetB");

                }

            }

Kao što vidite, dvije klase su nespojive - nemaju ni zajedničku bazu. Sljedeći popis kodova prikazuje kako izgledaju klase adaptora.

public interface ITargetAdapter

            {

                void ProcessData();

            }

public class AdapterA : ITargetAdapter

            {

                 public TargetA targetA { get; set; }

                 public void Process()

                 {

                     targetA.DisplayA();

                 }

                 public AdapterA(TargetA obj)

                 {

                     targetA = obj;

                 }

            }

            public class AdapterB : ITargetAdapter

            {

                 public TargetB targetB { get; set; }

                 public void Process() { targetB.DisplayB(); }

                 public AdapterB(TargetB obj)

                 {

                     targetB = obj;

                 }

            }

Imajte na umu da obje klase adaptora imaju jedno zajedničko sučelje nazvano ITargetAdapter koje ove klase implementiraju. Svaka od dvije klase adaptora ima konstruktor argumenata koji prihvaća referencu na objekt odgovarajuće ciljne klase. Sučelje ITargetAdapter sadrži deklaraciju metode Process (). Ovu metodu implementiraju obje klase adaptora - ove metode pozivaju Display () i odgovarajuće metode prikaza ciljanih klasa koje smo ranije implementirali.

Sljedeći popis kodova ilustrira kako možete koristiti ove klase adaptora.

class Program

    {

        static void Main(string[] args)

        {

            ITargetAdapter adapter = new AdapterA(new TargetA());

            adapter.Process();

            adapter = new AdapterB(new TargetB());

            adapter.Process();

            Console.Read();

        }

Kao što vidite u gornjem isječku koda, moramo proslijediti instancu odgovarajuće ciljne klase konstruktoru klase adaptora.

Diskusije o više dizajnerskih obrazaca predstavit ću u svojim sljedećim postovima ovdje. Uzorak dizajna adaptera može biti dobar izbor kada biste trebali pozvati naslijeđeni kôd u svojim aplikacijama. Iz ovog članka možete saznati više o uzorku dizajna adaptera.