Cara bekerja dengan corak reka bentuk Dekorator di C #

Corak reka bentuk adalah penyelesaian untuk masalah dan kerumitan berulang dalam reka bentuk perisian dan diklasifikasikan kepada tiga kategori berbeza: penciptaan, struktur, dan tingkah laku.

Corak reka bentuk Dekorator adalah corak struktur dan dapat digunakan untuk menambahkan fungsi pada sesuatu objek secara dinamis tanpa perlu mengubah struktur objek. Pada hakikatnya, anda dapat memanfaatkan corak Dekorator untuk melampirkan fungsi atau tingkah laku pada objek secara dinamis atau statik tanpa perlu mengubah struktur objek.

Perhatikan bahawa corak reka bentuk Dekorator mengikuti Prinsip Tertutup Terbuka, salah satu prinsip SOLID. Secara kebetulan, Prinsip Tertutup Terbuka digunakan untuk merancang kelas yang terbuka untuk sambungan tetapi ditutup untuk pengubahsuaian. Kesesuaian dengan Prinsip Tertutup Terbuka memudahkan aplikasi bangunan yang boleh digunakan semula dan dapat dikekalkan dengan mudah. The Gang of Four (GOF) di Dofactory menyatakan: "Laksanakan tanggungjawab tambahan pada objek secara dinamik. Penghias menyediakan alternatif yang fleksibel untuk subkelas untuk memperluas fungsi."

Sedikit kod

Di bahagian ini kita akan menerangkan bagaimana kita dapat menerapkan corak reka bentuk Dekorator di C #. Peserta dalam pelaksanaan khas corak reka bentuk Dekorator merangkumi:

  1.  Komponen - ini mewakili jenis asas dari jenis sebenar atau konkrit
  2. Komponen Konkrit - ini mewakili jenis konkrit yang memanjangkan komponen asas. Perhatikan bahawa tanggungjawab atau fungsi tambahan ditambahkan dalam jenis ini.
  3. Penghias - ini mewakili rujukan pada komponen. Fungsi dinamik ditambah dalam jenis ini.

Sekarang, mari kita pertimbangkan kelas berikut.

public abstract class Employee

   {

       public abstract string Display();

   }

Perhatikan bahawa semasa menggunakan corak reka bentuk Dekorator, anda memperluaskan tingkah laku kelas yang ada tetapi tidak semestinya anda harus menggunakan jenis abstrak - jenisnya mungkin atau tidak abstrak. Anda juga boleh menerapkan corak reka bentuk Dekorator menggunakan antara muka, atau bahkan dengan menggunakan kaedah yang maya di kelas konkrit anda. Pada hakikatnya, anda tidak dibatasi untuk menggunakan kelas abstrak sahaja ketika melaksanakan corak reka bentuk Dekorator. Kami menggunakan kelas abstrak di sini hanya untuk kesederhanaan.

Kelas EmployeeConcrete meluaskan kelas Employee dan menambahkan sifat tambahan kepadanya. Begini rupa kelas ini.

   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();

       }

   }

Kelas EmployeeDecorator meluaskan kelas Employee, menerima contoh kelas komponen bernama Employee, dan mengganti kaedah Display (). Begini rupa kelas ini.

public class EmployeeDecorator : Employee

   {

       Employee employee = null;

       protected EmployeeDecorator(Employee employee)

       {

           this.employee = employee;

       }

       public override string Display()

       {

           return employee.Display();

       }

   }

Setelah komponen, komponen konkrit dan kelas penghias siap, anda kini boleh melanjutkan kelas EmployeeDecorator untuk membuat kelas penghias konkrit. Penyenaraian kod berikut menunjukkan bagaimana rupa kelas ini.

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";

       }

   }

Dan, itu sahaja yang perlu anda lakukan! Anda sekarang boleh membuat contoh PermanentEm EmployeeDecorator dan menggunakannya seperti yang ditunjukkan dalam coretan kod di bawah.

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();

       }

Anda juga boleh mempunyai jenis pekerja lain - pekerja kontrak. Untuk melambangkannya, anda perlu membuat kelas lain bernama ContractEm EmployeeDecorator yang meluaskan kelas EmployeeDecorator. Rujuk coretan kod yang diberikan di bawah.

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";

       }

   }

Coretan kod berikut menggambarkan bagaimana anda boleh menggunakan kelas ContractEm EmployeeDecorator.

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();

       }