Bagaimana bekerja dengan pola desain Dekorator di C #

Pola desain adalah solusi untuk masalah yang berulang dan kompleksitas dalam desain perangkat lunak dan diklasifikasikan ke dalam tiga kategori berbeda: kreasi, struktural, dan perilaku.

Pola desain Dekorator adalah pola struktural dan dapat digunakan untuk menambahkan fungsionalitas ke suatu objek secara dinamis tanpa perlu memodifikasi struktur objek. Intinya, Anda dapat memanfaatkan pola Dekorator untuk melampirkan fungsionalitas atau perilaku ke objek secara dinamis atau statis tanpa perlu mengubah struktur objek.

Perhatikan bahwa pola desain Dekorator mengikuti Prinsip Tertutup Terbuka, salah satu prinsip SOLID. Kebetulan, Prinsip Tertutup Terbuka digunakan untuk mendesain kelas yang terbuka untuk ekstensi tetapi tertutup untuk modifikasi. Kesesuaian dengan Prinsip Tertutup Terbuka memfasilitasi aplikasi bangunan yang dapat digunakan kembali dan dapat dipelihara dengan mudah. The Gang of Four (GOF) di Dofactory menyatakan: "Lampirkan tanggung jawab tambahan ke sebuah objek secara dinamis. Dekorator memberikan alternatif yang fleksibel untuk subclass untuk memperluas fungsionalitas."

Sedikit kode

Pada bagian ini kita akan mengeksplorasi bagaimana kita dapat mengimplementasikan pola desain Dekorator di C #. Para peserta dalam implementasi tipikal pola desain Dekorator meliputi:

  1.  Komponen - ini mewakili tipe dasar dari tipe aktual atau beton
  2. Komponen Beton - ini mewakili jenis beton yang memperpanjang komponen dasar. Perhatikan bahwa tanggung jawab atau fungsi tambahan ditambahkan pada tipe ini.
  3. Dekorator - ini mewakili referensi ke komponen. Fungsionalitas dinamis ditambahkan pada tipe ini.

Sekarang, mari pertimbangkan kelas berikut.

public abstract class Employee

   {

       public abstract string Display();

   }

Perhatikan bahwa saat menggunakan pola desain Dekorator, Anda memperluas perilaku kelas yang sudah ada tetapi itu tidak berarti Anda harus menggunakan tipe abstrak - jenisnya mungkin abstrak atau tidak. Anda juga dapat menerapkan pola desain Dekorator menggunakan antarmuka, atau bahkan dengan menggunakan metode virtual di kelas beton Anda. Intinya, Anda tidak dibatasi untuk hanya menggunakan kelas abstrak saat menerapkan pola desain Dekorator. Kami menggunakan kelas abstrak di sini hanya demi kesederhanaan.

Kelas EmployeeConcrete memperluas kelas Karyawan dan menambahkan properti tambahan ke dalamnya. Seperti inilah tampilan 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 memperluas kelas Karyawan, menerima instance dari kelas komponen bernama Karyawan, dan mengganti metode Display (). Seperti inilah tampilan kelas ini.

public class EmployeeDecorator : Employee

   {

       Employee employee = null;

       protected EmployeeDecorator(Employee employee)

       {

           this.employee = employee;

       }

       public override string Display()

       {

           return employee.Display();

       }

   }

Sekarang setelah komponen, komponen beton, dan kelas dekorator sudah siap, Anda sekarang dapat memperluas kelas EmployeeDecorator untuk membuat kelas dekorator beton. Daftar kode berikut menunjukkan bagaimana kelas ini akan terlihat.

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, hanya itu yang perlu Anda lakukan! Anda sekarang dapat membuat instance PermanentEmployeeDecorator dan menggunakannya seperti yang ditunjukkan pada cuplikan kode di bawah ini.

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 dapat memiliki jenis karyawan lain - karyawan kontrak. Untuk mewakilinya, Anda perlu membuat kelas lain bernama ContractEmployeeDecorator yang memperluas kelas EmployeeDecorator. Lihat potongan kode yang diberikan di bawah ini.

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

       }

   }

Potongan kode berikut menggambarkan bagaimana Anda dapat menggunakan kelas ContractEmployeeDecorator.

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

       }