Programovanie

Ako pracovať s návrhovým vzorom Decorator v C #

Dizajnové vzory sú riešením opakujúcich sa problémov a zložitostí v softvérovom dizajne a sú rozdelené do troch odlišných kategórií: kreacionálne, štrukturálne a behaviorálne.

Dizajnový vzor Decorator je štruktúrny vzor a je možné ho použiť na pridanie funkčnosti objektu dynamicky bez potreby úpravy štruktúry objektu. V zásade môžete využiť dekorátorský vzor na pripojenie funkčnosti alebo správania k objektu dynamicky alebo staticky, takže nie je potrebné meniť štruktúru objektu.

Upozorňujeme, že návrhový vzor dekorátora sa riadi princípom Open Closed Principle, jedným z princípov SOLID. Princíp Open Closed sa mimochodom používa na navrhovanie tried, ktoré sú otvorené pre rozšírenia, ale uzavreté pre úpravy. Zhoda s princípom otvoreného zatvorenia uľahčuje vytváranie aplikácií, ktoré sú opakovane použiteľné a dajú sa ľahko udržiavať. The Gang of Four (GOF) v Dofactory uvádza: "Dynamicky pripájajte k objektu ďalšie zodpovednosti. Dekoratéri poskytujú flexibilnú alternatívu k podtriede pre rozšírenie funkčnosti."

Trochu kódu

V tejto časti preskúmame, ako môžeme implementovať návrhový vzor Decorator v C #. Medzi účastníkov typickej implementácie návrhového vzoru Decorator patria:

  1. Komponent - predstavuje základný typ skutočného alebo konkrétneho typu
  2. Betónový komponent - predstavuje konkrétny typ, ktorý rozširuje základný komponent. Upozorňujeme, že v tomto type sú pridané ďalšie zodpovednosti alebo funkcie.
  3. Dekoratér - predstavuje odkaz na komponent. V tomto type sú pridané dynamické funkcie.

Uvažujme teraz o nasledujúcej triede.

verejná abstraktná trieda Zamestnanec

   {

verejný abstraktný reťazec Display ();

   }

Upozorňujeme, že pri použití návrhového vzoru Decorator rozšírite správanie existujúcej triedy, ale to nevyhnutne neznamená, že musíte používať abstraktné typy - typy môžu alebo nemusia byť abstraktné. Môžete tiež implementovať návrhový vzor Decorator pomocou rozhraní alebo dokonca pomocou metód, ktoré sú vo vašich konkrétnych triedach virtuálne. V zásade nie ste nútení pri implementácii návrhového vzoru dekorátora používať iba abstraktné triedy. Používame tu abstraktnú triedu len kvôli jednoduchosti.

Trieda EmployeeConcrete rozširuje triedu Employee a pridáva k nej ďalšie vlastnosti. Takto by vyzerala táto trieda.

   public class EmployeeConcrete: Zamestnanec

   {

verejný reťazec FirstName {set; dostať; }

verejný reťazec Priezvisko {set; dostať; }

public string Adresa {set; dostať; }

verejný reťazec prepísania Display ()

       {

StringBuilder data = new StringBuilder ();

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

data.Append ("\ nPriezvisko:" + priezvisko);

data.Append ("\ nAdresa:" + adresa);

vrátiť data.ToString ();

       }

   }

Trieda EmployeeDecorator rozširuje triedu Employee, prijíma inštanciu triedy komponentov s názvom Employee a prepíše metódu Display (). Takto by vyzerala táto trieda.

verejná trieda EmployeeDecorator: Employee

   {

Zamestnanec zamestnanec = null;

chránený EmployeeDecorator (zamestnanec zamestnanca)

       {

this.employee = zamestnanec;

       }

verejný reťazec prepísania Display ()

       {

návrat zamestnanca.Display ();

       }

   }

Teraz, keď je komponent, betónový komponent a trieda dekoratéra pripravené, môžete teraz rozšíriť triedu EmployeeDecorator a vytvoriť tak konkrétnu triedu dekoratéra. Nasledujúci zoznam kódov ukazuje, ako by táto trieda vyzerala.

verejná trieda PermanentEmployeeDecorator: EmployeeDecorator

   {

// Pridajte vlastnosti súvisiace so stálym zamestnancom

private double PF {get; sada; }

public PermanentEmployeeDecorator (zamestnanec): základ (zamestnanec)

       {   }

verejný reťazec prepísania Display ()

       {

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

       }

   }

A to je všetko, čo musíte urobiť! Teraz môžete vytvoriť inštanciu PermanentEmployeeDecorator a použiť ju tak, ako je to uvedené v útržku kódu nižšie.

static void Main (reťazec [] args)

       {

EmployeeConcrete employeeConcrete = nový EmployeeConcrete

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

PermanentEmployeeDecorator employeeDecorator = nový PermanentEmployeeDecorator (employeeConcrete);

Console.WriteLine (employeeDecorator.Display ());

Console.Read ();

       }

Môžete mať aj iný typ zamestnanca - zamestnanca na dohodu. Aby ste to reprezentovali, budete musieť vytvoriť ďalšiu triedu s názvom ContractEmployeeDecorator, ktorá rozširuje triedu EmployeeDecorator. Prečítajte si útržok kódu uvedený nižšie.

public class ContractEmployeeDecorator: EmployeeDecorator

   {

// Pridajte vlastnosti relevantné pre zamestnanca na dohodu

súkromné ​​dvojité RatePerHour {get; sada; }

verejná zmluvaEmployeeDecorator (zamestnanec): základ (zamestnanec)

       { }

verejný reťazec prepísania Display ()

       {

návratová základňa.Display () + "\ nTyp zamestnanca: Zmluvný";

       }

   }

Nasledujúci úryvok kódu ilustruje, ako môžete používať triedu ContractEmployeeDecorator.

static void Main (reťazec [] args)

       {

EmployeeConcrete employeeConcrete = nový EmployeeConcrete

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

ContractEmployeeDecorator employeeDecorator = nový ContractEmployeeDecorator (employeeConcrete);

Console.WriteLine (employeeDecorator.Display ());

Console.Read ();

       }