Programiranje

Kako delati z vzorcem oblikovalca Decorator v C #

Vzorci oblikovanja so rešitve za ponavljajoče se težave in zapletenosti pri oblikovanju programske opreme in so razvrščeni v tri različne kategorije: kreativni, strukturni in vedenjski.

Oblikovalski vzorec dekoraterja je strukturni vzorec in se lahko uporablja za dodajanje funkcionalnosti predmeta, ki dinamično odpravlja potrebo po spreminjanju strukture predmeta. V bistvu lahko vzorec dekoraterja izkoristite za dinamično dodajanje funkcionalnosti ali vedenja predmetu ali statično brez potrebe po spreminjanju strukture predmeta.

Upoštevajte, da oblikovalski vzorec dekoraterja sledi načelu odprto zaprto, enemu od SOLID načel. Mimogrede, odprto zaprto načelo se uporablja za oblikovanje razredov, ki so odprti za razširitve, zaprti pa za spremembe. Skladnost z načelom odprto zaprto olajša gradnjo aplikacij, ki jih je mogoče ponovno uporabiti in jih je mogoče enostavno vzdrževati. Gang of Four (GOF) pri Dofactory pravi: "Predmetu dinamično dodelite dodatne odgovornosti. Dekoraterji ponujajo prilagodljivo alternativo podrazvrstitvi za razširitev funkcionalnosti."

Malo kode

V tem poglavju bomo raziskali, kako lahko v C # uporabimo oblikovalski vzorec Decorator Udeleženci tipične izvedbe vzorca oblikovalca Decorator vključujejo:

  1. Sestavni del - predstavlja osnovni tip dejanskega ali konkretnega tipa
  2. Betonska komponenta - predstavlja vrsto betona, ki razširja osnovno komponento. Upoštevajte, da so pri tej vrsti dodane dodatne odgovornosti ali funkcije.
  3. Dekorater - predstavlja sklic na komponento. V tej vrsti so dodane dinamične funkcionalnosti.

Zdaj pa razmislimo o naslednjem razredu.

javni abstraktni razred Zaposlen

   {

javni abstraktni niz Display ();

   }

Upoštevajte, da pri uporabi vzorca oblikovalca Decorator razširite vedenje obstoječega razreda, vendar to ne pomeni nujno, da morate uporabljati abstraktne tipe - tipi so lahko ali niso abstraktni. Vzorec oblikovanja Decorator lahko implementirate tudi z vmesniki ali celo z metodami, ki so virtualne v vaših konkretnih razredih. V bistvu vam ni treba uporabljati samo abstraktnih razredov pri izvajanju vzorca oblikovanja Decorator. Tukaj uporabljamo abstraktni razred samo zaradi poenostavitve.

Razred EmployeeConcrete razširi razred Employee in mu doda dodatne lastnosti. Evo, kako bi izgledal ta razred.

   javni razred EmployeeConcrete: zaposleni

   {

javni niz FirstName {set; dobili; }

javni niz LastName {set; dobili; }

javni niz Naslov {set; dobili; }

javni preglasitveni niz Display ()

       {

StringBuilder podatki = nov StringBuilder ();

data.Append ("Ime:" + Ime);

data.Append ("\ nPriimek:" + Priimek);

data.Append ("\ nAdress:" + Naslov);

vrni podatke.ToString ();

       }

   }

Razred EmployeeDecorator razširi razred Employee, sprejme primerek razreda komponente z imenom Employee in preglasi metodo Display (). Evo, kako bi izgledal ta razred.

javni razred EmployeeDecorator: zaposleni

   {

Zaposleni zaposleni = null;

zaščiteni EmployeeDecorator (zaposleni zaposleni)

       {

this.employee = zaposleni;

       }

javni preglasitveni niz Display ()

       {

vrnitev zaposlenega.Display ();

       }

   }

Zdaj, ko so komponente, betonska komponenta in razred dekoraterja pripravljeni, lahko zdaj razširite razred EmployeeDecorator, da ustvarite razred dekoraterja betona. Naslednji seznam kod prikazuje, kako bi izgledal ta razred.

javni razred PermanentEfficieeDecorator: EmployeeDecorator

   {

// Dodajte lastnosti, pomembne za stalno zaposlenega

zasebni dvojni PF {get; set; }

public PermanentE EmployeeDecorator (zaposleni zaposleni): osnova (zaposleni)

       {   }

javni preglasitveni niz Display ()

       {

return base.Display () + "\ nVrsta zaposlenega: Stalno";

       }

   }

In to je vse, kar morate storiti! Zdaj lahko ustvarite primerek PermanentEfficieeDecorator in ga uporabite, kot je prikazano v spodnjem delčku kode.

statična praznina Main (string [] args)

       {

EmployeeConcrete workerConcrete = novo EmployeeConcrete

{FirstName = "Joydip", LastName = "Kanjilal", Address = "Hyderabad, India"};

PermanentEfficieeDecorator workerDecorator = nov PermanentEfficieeDecorator (workerConcrete);

Console.WriteLine (workerDecorator.Display ());

Console.Read ();

       }

Lahko imate tudi drugo vrsto zaposlenega - pogodbenega. Če ga želite predstaviti, bi morali ustvariti drug razred z imenom ContractEfficieeDecorator, ki razširja razred EmployeeDecorator. Glejte spodnji delček kode.

javni razred ContractE EmployeeDecorator: EmployeeDecorator

   {

// Dodajte lastnosti, pomembne za pogodbenega uslužbenca

zasebni dvojni RatePerHour {get; set; }

public ContractE EmployeeDecorator (zaposleni zaposleni): osnova (zaposleni)

       { }

javni preglasitveni niz Display ()

       {

return base.Display () + "\ nVrsta zaposlenega: pogodbeno";

       }

   }

Naslednji delček kode ponazarja, kako lahko uporabite razred ContractE EmployeeDecorator.

statična praznina Main (string [] args)

       {

EmployeeConcrete workerConcrete = novo EmployeeConcrete

{FirstName = "Joydip", LastName = "Kanjilal", Address = "Hyderabad, India"};

ContractE EmployeeDecorator workerDecorator = nov ContractE EmployeeDecorator (workerConcrete);

Console.WriteLine (workerDecorator.Display ());

Console.Read ();

       }

$config[zx-auto] not found$config[zx-overlay] not found