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:
- Komponent - predstavuje základný typ skutočného alebo konkrétneho typu
- 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.
- 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 ();
}