Programmering

Hvordan jobbe med dekoratørdesignmønsteret i C #

Designmønstre er løsninger på gjentatte problemer og kompleksiteter i programvaredesign og er klassifisert i tre forskjellige kategorier: skapelses-, strukturell og atferdsmessig.

Designermønsteret for dekoratør er et strukturelt mønster og kan brukes til å legge til funksjonalitet til et objekt dynamisk sans behovet for å endre strukturen til objektet. I hovedsak kan du utnytte dekoratørmønsteret for å feste funksjonalitet eller oppførsel til et objekt dynamisk eller statisk uten behovet for å endre objektets struktur.

Merk at dekoratørens designmønster følger Open Closed Principle, et av SOLID-prinsippene. Forresten brukes Open Closed Principle til å designe klasser som er åpne for utvidelser, men stengt for modifikasjoner. Overensstemmelse med Open Closed Principle letter bygningsapplikasjoner som er gjenbrukbare og som enkelt kan vedlikeholdes. Gang of Four (GOF) på Dofactory uttaler: "Fest ytterligere ansvar til et objekt dynamisk. Dekoratører gir et fleksibelt alternativ til underklassering for å utvide funksjonaliteten."

Litt kode

I denne delen vil vi undersøke hvordan vi kan implementere Decorator designmønsteret i C #. Deltakerne i en typisk implementering av Decorator-designmønsteret inkluderer:

  1. Komponent - dette representerer basistypen for den faktiske eller den konkrete typen
  2. Betongkomponent - dette representerer betongtypen som utvider basiskomponenten. Merk at tilleggsansvaret eller funksjonalitetene er lagt til i denne typen.
  3. Dekoratør - dette representerer en referanse til en komponent. De dynamiske funksjonalitetene er lagt til i denne typen.

La oss nå vurdere følgende klasse.

offentlig abstrakt klasse Ansatt

   {

offentlig abstrakt streng Display ();

   }

Merk at når du bruker Decorator-designmønsteret, utvider du oppførselen til en eksisterende klasse, men det betyr ikke nødvendigvis at du må bruke abstrakte typer - typene kan eller ikke være abstrakte. Du kan også implementere Decorator-designmønsteret ved hjelp av grensesnitt, eller til og med ved hjelp av metoder som er virtuelle i dine konkrete klasser. I hovedsak er du ikke tvunget til å bruke bare abstrakte klasser når du implementerer Decorator-designmønsteret. Vi bruker en abstrakt klasse her bare for enkelhets skyld.

Classen EmployeeConcrete utvider klassen Employee og legger til flere egenskaper til den. Slik ser denne klassen ut.

   offentlig klasse EmployeeConcrete: Employee

   {

offentlig streng Fornavn {sett; få; }

offentlig streng Etternavn {sett; få; }

offentlig streng Adresse {sett; få; }

public override string Display ()

       {

StringBuilder data = nye StringBuilder ();

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

data.Append ("\ nSiste navn:" + Etternavn);

data.Append ("\ nAdresse:" + adresse);

returner data.ToString ();

       }

   }

Klassen EmployeeDecorator utvider klassen Employee, godtar en forekomst av komponentklassen som heter Employee, og overstyrer Display () -metoden. Slik ser denne klassen ut.

offentlig klasse EmployeeDecorator: Employee

   {

Ansatt ansatt = null;

beskyttet EmployeeDecorator (ansatt ansatt)

       {

denne. arbeidstaker = ansatt;

       }

public override string Display ()

       {

returner ansatt. Vis ();

       }

   }

Nå som komponenten, betongkomponenten og dekoratørklassen er klar, kan du nå utvide klassen EmployeeDecorator til å lage en betongdekoratørklasse. Følgende kodeliste viser hvordan denne klassen vil se ut.

offentlig klasse PermanentEmployeeDecorator: EmployeeDecorator

   {

// Legg til eiendommer som er relevante for en fast ansatt

privat dobbel PF {get; sett; }

public PermanentEmployeeDecorator (ansatt ansatt): base (ansatt)

       {   }

public override string Display ()

       {

return base.Display () + "\ nMedarbeidertype: Permanent";

       }

   }

Og det er alt du trenger å gjøre! Du kan nå opprette en forekomst av PermanentEmployeeDecorator og bruke den som vist i kodebiten nedenfor.

statisk tomrom Main (streng [] args)

       {

EmployeeConcrete employeeConcrete = ny EmployeeConcrete

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

PermanentEmployeeDecorator employeeDecorator = ny PermanentEmployeeDecorator (medarbeiderbetong);

Console.WriteLine (employeeDecorator.Display ());

Console.Read ();

       }

Du kan også ha en annen type ansatte - en kontraktsansatt. For å representere det, må du opprette en annen klasse med navnet ContractEmployeeDecorator som utvider EmployeeDecorator-klassen. Se kodebiten gitt nedenfor.

offentlig klasse ContractEmployeeDecorator: EmployeeDecorator

   {

// Legg til eiendommer som er relevante for en kontraktsansatt

privat dobbel RatePerHour {get; sett; }

public ContractEmployeeDecorator (Ansatt ansatt): base (ansatt)

       { }

public override string Display ()

       {

return base.Display () + "\ nMedarbeidertype: Kontraktuell";

       }

   }

Følgende kodebit illustrerer hvordan du kan bruke klassen ContractEmployeeDecorator.

statisk tomrom Main (streng [] args)

       {

EmployeeConcrete employeeConcrete = ny EmployeeConcrete

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

ContractEmployeeDecorator employeeDecorator = ny ContractEmployeeDecorator (medarbeiderbetong);

Console.WriteLine (employeeDecorator.Display ());

Console.Read ();

       }

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