Programavimas

Kaip dirbti su dekoratoriaus dizaino modeliu C #

Dizaino modeliai yra pasikartojančių programinės įrangos projektavimo problemų ir sudėtingumo sprendimai. Jie skirstomi į tris skirtingas kategorijas: kūrybos, struktūros ir elgesio.

„Decorator“ dizaino modelis yra struktūrinis raštas ir gali būti naudojamas objektui pridėti funkcionalumo, kuris dinamiškai reiškia poreikį modifikuoti objekto struktūrą. Iš esmės, jūs galite pasinaudoti dekoratoriaus modeliu, kad dinamiškai ar statiškai objektui pritrauktumėte funkcionalumą ar elgesį, o tai nereikalauja keisti objekto struktūros.

Atkreipkite dėmesį, kad „Decorator“ dizaino modelis atitinka „Open Closed Principle“, vieną iš SOLID principų. Beje, „Open Closed Principle“ naudojamas kuriant klases, kurios yra atviros plėtiniams, bet uždarytos modifikacijoms. Atitikimas atviram uždaram principui palengvina daugkartinio naudojimo ir lengvai prižiūrimų programų kūrimą. „Dofactory“ keturių gauja (GOF) teigia: „Dinamiškai priskirkite objektui papildomas pareigas. Dekoratoriai suteikia lanksčią alternatyvos poklasiui funkcionalumo išplėtimui“.

Šiek tiek kodo

Šiame skyriuje mes ištirsime, kaip mes galime įgyvendinti „Decorator“ dizaino modelį C #. Tipiško „Decorator“ dizaino modelio įgyvendinimo dalyviai yra šie:

  1. Komponentas - tai faktinio arba betono tipo pagrindo tipas
  2. Betono komponentas - tai betono tipas, pratęsiantis pagrindinį komponentą. Atkreipkite dėmesį, kad prie šio tipo pridedamos papildomos pareigos ar funkcijos.
  3. Dekoratorius - tai nuoroda į komponentą. Šio tipo dinaminės funkcijos pridedamos.

Dabar apsvarstykime šią klasę.

viešoji abstrakčioji klasė Darbuotojas

   {

vieša abstrakti eilutė „Display“ ();

   }

Atkreipkite dėmesį, kad naudodami „Decorator“ dizaino modelį jūs praplečiate esamos klasės elgesį, tačiau tai dar nereiškia, kad turite naudoti abstrakčius tipus - tipai gali būti abstraktūs, o gal ir ne. „Decorator“ dizaino modelį taip pat galite įdiegti naudodami sąsajas ar net naudodami metodus, virtualius jūsų konkrečiose klasėse. Iš esmės, įgyvendinant „Decorator“ dizaino modelį, jūs neprivalote naudoti tik abstrakčių klasių. Mes čia naudojame abstrakčią klasę tik dėl paprastumo.

„EmployeeConcrete“ klasė praplečia „Employee“ klasę ir prideda jai papildomų savybių. Štai kaip atrodys ši klasė.

   viešoji klasė „Darbuotojas“ Betonas: „Darbuotojas“

   {

vieša eilutė FirstName {set; gauti; }

public string LastName {set; gauti; }

viešoji eilutė Adresas {set; gauti; }

viešas nepaisyti eilutės ekranas ()

       {

StringBuilder duomenys = new StringBuilder ();

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

data.Append ("\ nPaskutinis vardas:" + Pavardė);

duomenys.Append ("\ nAdresas:" + adresas);

grąžinti duomenis.ToString ();

       }

   }

„EmployeeDecorator“ klasė praplečia „Employee“ klasę, priima komponentų klasės egzempliorių pavadinimu „Employee“ ir nepaiso „Display“) metodo. Štai kaip atrodys ši klasė.

viešosios klasės „EmployeeDecorator“: darbuotojas

   {

Darbuotojo darbuotojas = null;

apsaugotas „EmployeeDecorator“ (darbuotojo darbuotojas)

       {

tai.darbuotojas = darbuotojas;

       }

viešas nepaisyti eilutės ekranas ()

       {

grįžtantis darbuotojas.Vaizdas ();

       }

   }

Dabar, kai komponentų, betoninių komponentų ir dekoratorių klasė yra paruošta, dabar galite išplėsti „EmployeeDecorator“ klasę, kad sukurtumėte betono dekoratorių klasę. Šis kodų sąrašas parodo, kaip ši klasė atrodys.

viešoji klasė „Nuolatinis darbuotojas dekoratorius“: „Darbuotojo dekoratorius“

   {

// Pridėkite savybių, susijusių su nuolatiniu darbuotoju

privatus dvigubas PF {get; rinkinys; }

public NuolatinisEmployeeDecorator (darbuotojo darbuotojas): bazė (darbuotojas)

       {   }

viešas nepaisyti eilutės ekranas ()

       {

grąžinimo bazė.Display () + "\ nDarbuotojo tipas: Nuolatinis";

       }

   }

Ir tai viskas, ką jums reikia padaryti! Dabar galite sukurti „PermanentEmployeeDecorator“ egzempliorių ir naudoti jį taip, kaip parodyta žemiau esančiame kodo fragmente.

static void Main (string [] args)

       {

EmployeeConcrete workerConcrete = new EmployeeConcrete

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

PermanentEmployeeDecorator workerDecorator = naujas PermanentEmployeeDecorator (darbuotojasbetonas);

Console.WriteLine (workerDecorator.Display ());

Pultas.Skaitykite ();

       }

Taip pat galite turėti kitą darbuotojo tipą - pagal sutartį dirbančią darbuotoją. Norėdami jį reprezentuoti, turėsite sukurti dar vieną klasę pavadinimu „ContractEmployeeDecorator“, kuri pratęsia „EmployeeDecorator“ klasę. Žr. Toliau pateiktą kodo fragmentą.

viešoji klasė „ContractEmployeeDecorator“: „EmployeeDecorator“

   {

// Pridėkite sutartininkui svarbių savybių

privatus dvigubas RatePerHour {get; rinkinys; }

viešoji sutartisEmployeeDecorator (darbuotojo darbuotojas): bazė (darbuotojas)

       { }

viešas nepaisyti eilutės ekranas ()

       {

grąžinimo bazė.Display () + "\ nDarbuotojo tipas: sutartinė";

       }

   }

Šis kodo fragmentas parodo, kaip galite naudoti „ContractEmployeeDecorator“ klasę.

static void Main (string [] args)

       {

EmployeeConcrete workerConcrete = new EmployeeConcrete

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

ContractEmployeeDecorator workerDecorator = naujas ContractEmployeeDecorator (darbuotojasbetonas);

Console.WriteLine (workerDecorator.Display ());

Pultas.Skaitykite ();

       }