Programování

Jak pracovat s návrhovým vzorem Decorator v C #

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ří:

  1. Komponenta - představuje základní typ skutečného nebo konkrétního typu
  2. 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.
  3. 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 ();

       }