Kako raditi s uzorkom dizajna Decorator u C #

Uzorci dizajna rješenja su za ponavljajuće probleme i složenosti u dizajnu softvera i klasificirani su u tri različite kategorije: kreativni, strukturni i bihevioralni.

Uzorak dizajnera Dekorater je strukturni uzorak i može se koristiti za dodavanje funkcionalnosti objekta dinamički bez potrebe za izmjenom strukture objekta. U osnovi, možete iskoristiti uzorak dekoratora kako biste objektu dinamički dodali funkcionalnost ili ponašanje ili statički umanjili potrebu za promjenom strukture objekta.

Imajte na umu da obrazac dizajna Dekoratora slijedi Otvoreni zatvoreni princip, jedan od ČVRSTIH principa. Inače, Otvoreni zatvoreni princip koristi se za dizajniranje klasa otvorenih za proširenja, ali zatvorenih za preinake. Sukladnost s otvorenim zatvorenim načelom olakšava izgradnju aplikacija koje se mogu ponovno koristiti i koje se lako mogu održavati. Banda četvorke (GOF) u Dofactory-u kaže: "Dinamično pridodajte dodatne odgovornosti objektu. Dekoratori pružaju fleksibilnu alternativu potklasiranju za proširenje funkcionalnosti."

Malo koda

U ovom ćemo odjeljku istražiti kako možemo implementirati obrazac dizajnera Decorator u C #. Sudionici u tipičnoj provedbi uzorka dizajnera uključuju:

  1.  Komponenta - predstavlja osnovnu vrstu stvarne ili konkretne vrste
  2. Komponenta betona - predstavlja vrstu betona koja proširuje osnovnu komponentu. Imajte na umu da su ovoj vrsti dodane dodatne odgovornosti ili funkcionalnosti.
  3. Dekorator - ovo predstavlja referencu na komponentu. Dinamičke funkcionalnosti dodane su ovom tipu.

Sada, razmotrimo sljedeći razred.

public abstract class Employee

   {

       public abstract string Display();

   }

Imajte na umu da kada koristite uzorak dizajnera Decorator, proširite ponašanje postojeće klase, ali to ne mora nužno značiti da morate koristiti apstraktne tipove - tipovi mogu, ali ne moraju biti apstraktni. Uzorak dizajna Decorator također možete implementirati pomoću sučelja ili čak pomoću metoda koje su virtualne u vašim konkretnim klasama. U osnovi, niste primorani koristiti samo apstraktne klase kada implementirate uzorak dizajna Decorator. Ovdje koristimo apstraktnu klasu samo radi jednostavnosti.

Klasa EmployeeConcrete proširuje klasu Employee i dodaje joj dodatna svojstva. Evo kako bi ovaj razred izgledao.

   public class EmployeeConcrete : Employee

   {

       public string FirstName { set; get; }

       public string LastName { set; get; }

       public string Address { set; get; }

       public override string Display()

       {

           StringBuilder data = new StringBuilder();

           data.Append("First name: " + FirstName);

            data.Append("\nLast name: " + LastName);

           data.Append("\nAddress: " + Address);

           return data.ToString();

       }

   }

Klasa EmployeeDecorator proširuje klasu Employee, prihvaća instancu klase komponente nazvane Employee i zamjenjuje metodu Display (). Evo kako bi ovaj razred izgledao.

public class EmployeeDecorator : Employee

   {

       Employee employee = null;

       protected EmployeeDecorator(Employee employee)

       {

           this.employee = employee;

       }

       public override string Display()

       {

           return employee.Display();

       }

   }

Sada kada su komponenta, betonska komponenta i klasa dekoratora spremne, sada možete proširiti klasu EmployeeDecorator kako biste stvorili klasu dekoratora betona. Sljedeći popis koda pokazuje kako bi ova klasa izgledala.

public class PermanentEmployeeDecorator : EmployeeDecorator

   {

       //Add properties relevant to a permanent employee

       private double PF { get; set; }

       public PermanentEmployeeDecorator(Employee employee) : base(employee)

       {   }

       public override string Display()

       {

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

       }

   }

I to je sve što trebate učiniti! Sada možete stvoriti instancu PermanentEfficieeDecorator i koristiti je kao što je prikazano u isječku koda u nastavku.

static void Main(string[] args)

       {

           EmployeeConcrete employeeConcrete = new EmployeeConcrete

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

           PermanentEmployeeDecorator employeeDecorator = new PermanentEmployeeDecorator(employeeConcrete);

           Console.WriteLine(employeeDecorator.Display());

           Console.Read();

       }

Možete imati i drugu vrstu zaposlenika - ugovornog radnika. Da biste ga predstavili, trebali biste stvoriti drugu klasu nazvanu ContractEfficieeDecorator koja proširuje klasu EmployeeDecorator. Pogledajte isječak koda dan u nastavku.

public class ContractEmployeeDecorator : EmployeeDecorator

   {

       //Add properties relevant to a contract employee

       private double RatePerHour { get; set; }

       public ContractEmployeeDecorator(Employee employee) : base(employee)

       { }

       public override string Display()

       {

           return base.Display() + "\nEmployee type: Contractual";

       }

   }

Sljedeći isječak koda ilustrira kako možete koristiti klasu ContractEfficieeDecorator.

static void Main(string[] args)

       {

           EmployeeConcrete employeeConcrete = new EmployeeConcrete

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

           ContractEmployeeDecorator employeeDecorator = new ContractEmployeeDecorator(employeeConcrete);

           Console.WriteLine(employeeDecorator.Display());

           Console.Read();

       }