Návrhové vzory jsou řešení opakujících se problémů a složitostí v softwarovém designu a jsou rozděleny do tří odlišných kategorií: kreační, strukturální a behaviorální.
Návrhový vzor dekorátoru je strukturální vzor a lze jej použít k přidání funkčnosti objektu dynamicky bez nutnosti úpravy struktury objektu. V podstatě můžete využít dekorátorský vzor k dynamickému nebo statickému připojení funkčnosti nebo chování k objektu, takže není nutné měnit strukturu objektu.
Všimněte si, že návrhový vzor dekoratéru se řídí principem Open Closed Principle, jedním z principů SOLID. Mimochodem, princip Open Closed se používá k navrhování tříd, které jsou otevřené pro rozšíření, ale uzavřené pro úpravy. Shoda s principem otevřeného uzavřeného usnadňuje vytváření aplikací, které jsou opakovaně použitelné a lze je snadno udržovat. The Gang of Four (GOF) v Dofactory uvádí: "Dynamicky připojte k objektu další odpovědnosti. Dekorátoři poskytují flexibilní alternativu k podtřídě pro rozšíření funkčnosti."
Trochu kódu
V této části prozkoumáme, jak můžeme implementovat návrhový vzor Decorator v C #. Mezi účastníky typické implementace návrhového vzoru dekorátoru patří:
- Komponenta - představuje základní typ skutečného nebo konkrétního typu
- Betonová komponenta - představuje konkrétní typ, který rozšiřuje základní komponentu. U tohoto typu jsou přidány další odpovědnosti nebo funkce.
- Dekorátor - představuje odkaz na komponentu. V tomto typu jsou přidány dynamické funkce.
Zvažme následující třídu.
veřejná abstraktní třída Zaměstnanec
{
veřejný abstraktní řetězec Display ();
}
Všimněte si, že když používáte návrhový vzor Decorator, rozšíříte chování existující třídy, ale to nutně neznamená, že musíte použít abstraktní typy - typy mohou nebo nemusí být abstraktní. Můžete také implementovat návrhový vzor Decorator pomocí rozhraní nebo dokonce pomocí metod, které jsou ve vašich konkrétních třídách virtuální. V podstatě nejste nuceni používat při implementaci návrhového vzoru dekorátoru pouze abstraktní třídy. Používáme zde abstraktní třídu pouze pro jednoduchost.
Třída EmployeeConcrete rozšiřuje třídu Employee a přidává do ní další vlastnosti. Takto by tato třída vypadala.
public class EmployeeConcrete: Zaměstnanec
{
veřejný řetězec FirstName {set; dostat; }
veřejný řetězec Příjmení {set; dostat; }
public string Adresa {set; dostat; }
public override string Display ()
{
StringBuilder data = new StringBuilder ();
data.Append ("Jméno:" + Jméno);
data.Append ("\ nPříjmení:" + příjmení);
data.Append ("\ nAddress:" + adresa);
vrátit data.ToString ();
}
}
Třída EmployeeDecorator rozšiřuje třídu Employee, přijímá instanci třídy komponenty s názvem Employee a přepisuje metodu Display (). Takto by tato třída vypadala.
public class EmployeeDecorator: Zaměstnanec
{
Zaměstnanec zaměstnance = null;
chráněný EmployeeDecorator (zaměstnanec)
{
this.employee = zaměstnanec;
}
public override string Display ()
{
vrátit zaměstnance.Display ();
}
}
Nyní, když je komponenta, betonová komponenta a třída dekoratéra připravena, můžete nyní rozšířit třídu EmployeeDecorator a vytvořit konkrétní dekorační třídu. Následující výpis kódu ukazuje, jak by tato třída vypadala.
veřejná třída PermanentEmployeeDecorator: EmployeeDecorator
{
// Přidat vlastnosti relevantní pro stálého zaměstnance
private double PF {get; soubor; }
public PermanentEmployeeDecorator (zaměstnanec): base (employee)
{ }
public override string Display ()
{
návrat base.Display () + "\ nTyp zaměstnance: stálý";
}
}
A to je vše, co musíte udělat! Nyní můžete vytvořit instanci PermanentEmployeeDecorator a použít ji, jak je ukázáno v fragmentu kódu níže.
static void Main (řetězec [] args)
{
EmployeeConcrete employeeConcrete = nový EmployeeConcrete
{FirstName = "Joydip", LastName = "Kanjilal", adresa = "Hyderabad, Indie"};
PermanentEmployeeDecorator employeeDecorator = nový PermanentEmployeeDecorator (employeeConcrete);
Console.WriteLine (employeeDecorator.Display ());
Console.Read ();
}
Můžete mít i jiný typ zaměstnance - smluvního zaměstnance. Chcete-li to reprezentovat, budete muset vytvořit další třídu s názvem ContractEmployeeDecorator, která rozšiřuje třídu EmployeeDecorator. Viz fragment kódu uvedený níže.
public class ContractEmployeeDecorator: EmployeeDecorator
{
// Přidat vlastnosti relevantní pro zaměstnance smlouvy
soukromé dvojité RatePerHour {get; soubor; }
public ContractEmployeeDecorator (zaměstnanec zaměstnanec): base (employee)
{ }
public override string Display ()
{
návrat base.Display () + "\ n Typ zaměstnance: Smluvní";
}
}
Následující fragment kódu ukazuje, jak můžete použít třídu ContractEmployeeDecorator.
static void Main (řetězec [] args)
{
EmployeeConcrete employeeConcrete = nový EmployeeConcrete
{FirstName = "Joydip", LastName = "Kanjilal", adresa = "Hyderabad, Indie"};
ContractEmployeeDecorator employeeDecorator = nový ContractEmployeeDecorator (employeeConcrete);
Console.WriteLine (employeeDecorator.Display ());
Console.Read ();
}