Menerapkan pola desain Observer di C #

Pola desain Observer termasuk dalam kategori Pola desain perilaku dan digunakan saat Anda ingin memberi tahu perubahan ke sejumlah kelas. Pola desain perilaku adalah pola yang digunakan untuk menangani kolaborasi objek dan pendelegasian tanggung jawab.

Pada dasarnya, pola desain Observer digunakan untuk menentukan bagaimana komunikasi antar komponen dalam aplikasi berinteraksi satu sama lain atau memberi tahu satu sama lain dengan mengirim pesan. Dalam pola ini, subjek menyimpan daftar pengamat dan kemudian memberi tahu pengamat ini atau tanggungannya jika dan ketika terjadi perubahan status. Anda juga dapat menambah atau menghapus pengamat saat runtime.

Penerapan

Kapan sebaiknya Anda menggunakan pola desain ini? Ini adalah pilihan yang baik jika Anda ingin memiliki subjek yang harus diamati oleh satu atau lebih pengamat. Ini adalah pola desain populer yang membantu Anda menerapkan skenario penerbit / pelanggan di mana perubahan status objek dapat diberitahukan ke semua objek atau pelanggan dependen (dalam implementasi tipikal skenario penerbit / pelanggan). Dalam pola desain Observer, perubahan status suatu objek dikomunikasikan ke objek lain tanpa perlu objek yang digabungkan erat satu sama lain.

Pola arsitektur MVC (Model View Component) adalah contoh klasik dari implementasi pola desain Observer. Pola arsitektur MVC digunakan untuk membangun aplikasi yang digabungkan secara longgar, lebih mudah untuk diuji dan dipelihara. Dalam implementasi MVC tipikal, Tampilan dan Model dipisahkan satu sama lain. Sementara View merepresentasikan Observer, Model merepresentasikan objek Observable Anda.

Menerapkan pola desain Observer

Kita sudah muak dengan konsepnya - sekarang mari kita pahami pola desain ini dengan implementasi. Pertama, kita perlu mengetahui kelas atau tipe yang berpartisipasi.

  • Subjek: Ini diwakili oleh tipe yang digunakan untuk menentukan antarmuka untuk memasang atau melepaskan satu atau lebih pengamat
  • ConcreteSubject: Ini digunakan untuk memberi tahu pengamat ketika ada perubahan status
  • Observer: Ini mewakili tipe yang harus diberitahukan ketika terjadi perubahan
  • ConcreteObserver: Ini mewakili implementasi konkret dari tipe pengamat

Dalam implementasi tipikal pola desain Observer, Anda mungkin ingin memiliki tipe Subjek dan tipe Observer. Berikut potongan kode yang menggambarkan hal ini.

    public abstract class Subject

    {

        protected List lstObservers = new List();

        protected void Register(Observer observer)

        {

            lstObservers.Add(observer);

        }

        protected void UnRegister(Observer observer)

        {

            lstObservers.Remove(observer);

        }

        protected void UnRegisterAll()

        {

            foreach (Observer observer in lstObservers)

            {

                lstObservers.Remove(observer);

            }

        }

        public abstract void Notify();

    }

public abstract class Observer

    {

        public abstract void Update();

    }

Sekarang, lihat potongan kode yang diberikan di atas. Kelas Subjek berisi daftar contoh Observer dan beberapa metode untuk menambah atau menghapus pelanggan, yaitu contoh kelas Observer. Perhatikan bahwa metode Notify telah dideklarasikan abstrak - kelas yang akan memperluas kelas Subjek perlu menyediakan implementasi masing-masing untuk metode ini. Kelas Observer hanya berisi satu metode - metode Pembaruan. Saya telah membuat penerapan ini sesederhana mungkin.

Kelas BlogPost memperluas kelas Subjek dan mengimplementasikan metode Notify yang telah dideklarasikan sebagai abstrak di kelas Subjek.

public class BlogPost: Subject

    {

        public void Attach(Observer observer)

        {

            //You can write your own implementation here or call the base version

            base.Register(observer);

        }

        public void Detach(Observer observer)

        {

            //You can write your own implementation here or call the base version

            base.UnRegister(observer);

        }

        public void DetachAll()

        {

            //You can write your own implementation here or call the base version

            base.UnRegisterAll();

        }

        public override void Notify()

        {

            foreach (Observer observer in lstObservers)

            {

                observer.Update();

            }

        }

    }

Kelas ConcreteObserver diberikan di bawah ini. Saya menyerahkan kepada pembaca untuk menulis kode mereka sendiri dalam metode Pembaruan untuk mengirim email yang memberi tahu bahwa sebuah artikel telah diposting, atau, dll.

public class ConcreteObserver : Observer

    {

        public string Email

        {

            get; set;

        }

        public override void Update()

        {

            Console.WriteLine("Inside the Update method...");

        }

    }

Anda dapat mempelajari lebih lanjut tentang pola desain Observer dari tautan ini.