Programmering

Sådan arbejder du med Decorator design mønster i C #

Designmønstre er løsninger på tilbagevendende problemer og kompleksiteter i softwaredesign og klassificeres i tre forskellige kategorier: skabelses-, strukturel og adfærdsmæssig.

Decorator-designmønsteret er et strukturelt mønster og kan bruges til at tilføje funktionalitet til et objekt dynamisk sans behovet for at ændre objektets struktur. I det væsentlige kan du udnytte dekoratørmønstret til at vedhæfte funktionalitet eller adfærd til et objekt dynamisk eller statisk uden behovet for at ændre objektets struktur.

Bemærk, at dekoratørens designmønster følger Open Closed Principle, et af SOLID-principperne. I øvrigt bruges det åbne lukkede princip til at designe klasser, der er åbne for udvidelser, men lukkede for ændringer. Overensstemmelse med det åbne lukkede princip letter bygningsapplikationer, der kan genbruges og let kan vedligeholdes. Gang of Four (GOF) på Dofactory siger: "Vedhæft yderligere ansvar til et objekt dynamisk. Dekoratører giver et fleksibelt alternativ til underklasse for at udvide funktionaliteten."

Lidt kode

I dette afsnit vil vi undersøge, hvordan vi kan implementere Decorator-designmønsteret i C #. Deltagerne i en typisk implementering af Decorator-designmønsteret inkluderer:

  1. Komponent - dette repræsenterer basistypen for den aktuelle eller den konkrete type
  2. Betonkomponent - dette repræsenterer betontypen, der udvider basiskomponenten. Bemærk, at de yderligere ansvarsområder eller funktionaliteter tilføjes i denne type.
  3. Dekoratør - dette repræsenterer en henvisning til en komponent. De dynamiske funktioner tilføjes i denne type.

Lad os nu overveje følgende klasse.

offentlig abstrakt klasse Medarbejder

   {

offentlig abstrakt streng Display ();

   }

Bemærk, at når du bruger Decorator-designmønsteret, udvider du en eksisterende klasses opførsel, men det betyder ikke nødvendigvis, at du skal bruge abstrakte typer - typerne kan eller ikke er abstrakte. Du kan også implementere Decorator-designmønsteret ved hjælp af grænseflader eller endda ved hjælp af metoder, der er virtuelle i dine konkrete klasser. I det væsentlige er du ikke tvunget til kun at bruge abstrakte klasser, når du implementerer Decorator-designmønsteret. Vi bruger en abstrakt klasse her kun for enkelhedens skyld.

Klassen EmployeeConcrete udvider medarbejderklassen og tilføjer yderligere egenskaber til den. Sådan ser denne klasse ud.

   offentlig klasse EmployeeConcrete: Medarbejder

   {

offentlig streng Fornavn {sæt; få; }

offentlig streng Efternavn {sæt; få; }

offentlig streng Adresse {sæt; få; }

offentlig tilsidesættelse af streng Display ()

       {

StringBuilder data = nye StringBuilder ();

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

data.Append ("\ nEfternavn:" + Efternavn);

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

returnere data.ToString ();

       }

   }

Klassen EmployeeDecorator udvider medarbejderklassen, accepterer en forekomst af komponentklassen med navnet Employee og tilsidesætter metoden Display (). Sådan ser denne klasse ud.

offentlig klasse EmployeeDecorator: Medarbejder

   {

Medarbejdermedarbejder = null;

beskyttet EmployeeDecorator (Medarbejdermedarbejder)

       {

denne. medarbejder = medarbejder;

       }

offentlig tilsidesættelse af streng Display ()

       {

returnere medarbejder. Display ();

       }

   }

Nu når komponenten, betonkomponenten og dekoratørklassen er klar, kan du nu udvide klassen EmployeeDecorator til at oprette en klasse med betondekoratør. Følgende kodeliste viser, hvordan denne klasse vil se ud.

offentlig klasse PermanentEmployeeDecorator: EmployeeDecorator

   {

// Tilføj egenskaber, der er relevante for en fast ansat

privat dobbelt PF {get; sæt; }

public PermanentEmployeeDecorator (Medarbejdermedarbejder): base (medarbejder)

       {   }

offentlig tilsidesættelse af streng Display ()

       {

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

       }

   }

Og det er alt hvad du behøver at gøre! Du kan nu oprette en forekomst af PermanentEmployeeDecorator og bruge den som vist i kodestykket nedenfor.

statisk ugyldigt Main (streng [] args)

       {

EmployeeConcrete employeeConcrete = ny EmployeeConcrete

{FirstName = "Joydip", LastName = "Kanjilal", Adresse = "Hyderabad, Indien"};

PermanentEmployeeDecorator medarbejderDecorator = ny PermanentEmployeeDecorator (medarbejderbeton);

Console.WriteLine (medarbejderDecorator.Display ());

Console.Read ();

       }

Du kan også have en anden type medarbejder - en kontraktansat. For at repræsentere det skal du oprette en anden klasse ved navn ContractEmployeeDecorator, der udvider klassen EmployeeDecorator. Se kodestykket nedenfor.

offentlig klasse ContractEmployeeDecorator: EmployeeDecorator

   {

// Tilføj egenskaber, der er relevante for en kontraktansat

privat dobbelt RatePerHour {get; sæt; }

public ContractEmployeeDecorator (Medarbejdermedarbejder): base (medarbejder)

       { }

offentlig tilsidesættelse af streng Display ()

       {

return base.Display () + "\ nMedarbejdertype: Kontraktuel";

       }

   }

Følgende kodestykke illustrerer, hvordan du kan bruge klassen ContractEmployeeDecorator.

statisk ugyldigt Main (streng [] args)

       {

EmployeeConcrete employeeConcrete = ny EmployeeConcrete

{FirstName = "Joydip", LastName = "Kanjilal", Adresse = "Hyderabad, Indien"};

ContractEmployeeDecorator employeeDecorator = ny ContractEmployeeDecorator (medarbejderbeton);

Console.WriteLine (medarbejderDecorator.Display ());

Console.Read ();

       }