Observer Design Pattern trong C# – Cách triển khai và ví dụ

Trong bài viết này mình sẽ giới thiệu đến các bạn Observer Design Pattern trong C# – Cách triển khai và ví dụ. Đây là một pattern thuộc nhóm Behavioral Design Pattern trong C#.

Chúng ta sẽ cùng nhau tìm hiểu về Observer Design Pattern là gì? Cách triển khai trong C# và ví dụ cụ thể về nó.

Observer Design Pattern trong C# là gì?

Observer Design Pattern xác định sự phụ thuộc từ một đến nhiều giữa các đối tượng. Khi một đối tượng thay đổi trạng thái, tất cả các đối tượng phụ thuộc nó sẽ được thông báo và tự động cập nhật.

observer 01 png

Observer Design Pattern sẽ thông báo cho các thành phần phụ thuộc vào nó khi có thay đổi bằng cách gọi một trong các phương thức của chúng.

Bài viết này được đăng tại [kiso.vn]

Các tên gọi khác của mô hình này là Producer / Consumer, Publish / Subscribe.

Observer Design Pattern có hai thành phần chính như sau:

  • Subject: Đây là Publishers (nhà xuất bản), khi có một thay đổi xảy ra nó phải thông báo cho các Subscribers (người đăng ký).
  • Observer: Đây là các Subscribers, nó chỉ đơn giản là lắng nghe những thay đổi từ các đối tượng. Một tên gọi khác của Observer là Listener.

observer 02 png

Cách triển khai và ví dụ về Observer Design Pattern trong C#

Trong phần này mình sẽ thực hiện triển khai Observer Design Pattern thông qua một ví dụ cụ thể dưới đây. Các bạn hãy cùng mình thực hiện theo từng bước nhé.

Bước 1: Tạo interface ISubject.

Class này cung cấp một interface để thêm hoặc xóa bất kì số lượng đối tượng Observer nào.

using System;
using System.Collections.Generic;
using System.Text;

namespace ObserverDesignPattern
{
    public interface ISubject
    {
        void RegisterObserver(IObserver observer);
        void RemoveObserver(IObserver observer);
        void NotifyObservers();
    }
}

Bước 2: Tạo class Subject.

Class này lưu trữ các trạng thái cho Observer và chịu trách nhiệm gửi thông báo khi có thay đổi.

using System;
using System.Collections.Generic;
using System.Text;

namespace ObserverDesignPattern
{
    public class Subject : ISubject
    {
        private List<IObserver> observers = new List<IObserver>();
        private string ProductName { get; set; }
        private int ProductPrice { get; set; }
        private string Availability { get; set; }
        public Subject(string productName, int productPrice, string availability)
        {
            ProductName = productName;
            ProductPrice = productPrice;
            Availability = availability;
        }

        public string getAvailability()
        {
            return Availability;
        }
        public void setAvailability(string availability)
        {
            this.Availability = availability;
            Console.WriteLine("Availability changed from Out of Stock to Available.");
            NotifyObservers();
        }
        public void RegisterObserver(IObserver observer)
        {
            Console.WriteLine("Observer Added : " + ((Observer)observer).UserName);
            observers.Add(observer);
        }
        public void AddObservers(IObserver observer)
        {
            observers.Add(observer);
        }
        public void RemoveObserver(IObserver observer)
        {
            observers.Remove(observer);
        }
        public void NotifyObservers()
        {
            Console.WriteLine("Product Name :"
                            + ProductName + ", product Price : "
                            + ProductPrice + " is Now available. So notifying all Registered users ");
            Console.WriteLine();
            foreach (IObserver observer in observers)
            {
                observer.update(Availability);
            }
        }
    }
}

Bước 3: Tạo interface IObserver.

Class này xác định interface cập nhật cho các đối tượng cần được thông báo về những thay đổi.

using System;
using System.Collections.Generic;
using System.Text;

namespace ObserverDesignPattern
{
    public interface IObserver
    {
        void update(string availability);
    }
}

Bước 4: Tạo class Observer.

Class Observer duy trì việc tham chiếu đến một đối tượng Subject và triển khai interface IObserver.

using System;
using System.Collections.Generic;
using System.Text;

namespace ObserverDesignPattern
{
    public class Observer : IObserver
    {
        public string UserName { get; set; }
        public Observer(string userName, ISubject subject)
        {
            UserName = userName;
            subject.RegisterObserver(this);
        }

        public void update(string availabiliy)
        {
            Console.WriteLine("Hello " + UserName + ", Product is now " + availabiliy + " on Amazon");
        }
    }
}

Bước 5: Tạo class Program để chạy chương trình và kiểm tra kết quả.

using System;

namespace ObserverDesignPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create a Product with Out Of Stock Status
            Subject RedMI = new Subject("Red MI Mobile", 10000, "Out Of Stock");
            //User Anurag will be created and user1 object will be registered to the subject
            Observer user1 = new Observer("Anurag", RedMI);
            //User Pranaya will be created and user1 object will be registered to the subject
            Observer user2 = new Observer("Pranaya", RedMI);
            //User Priyanka will be created and user3 object will be registered to the subject
            Observer user3 = new Observer("Priyanka", RedMI);

            Console.WriteLine("Red MI Mobile current state : " + RedMI.getAvailability());
            Console.WriteLine();
            // Now product is available
            RedMI.setAvailability("Available");

            Console.WriteLine("n------------------------------------");
            Console.WriteLine("Chuong trinh nay duoc dang tai Kiso.vn");
            Console.Read();
        }
    }
}

Kết quả:

observer 03 png

Như vậy là chúng ta đã cùng nhau tìm hiểu về Observer Design Pattern trong C# – Cách triển khai và ví dụ cụ thể về nó. Ở bài tiếp theo mình sẽ giới thiệu đến các bạn Command Design Pattern trong C#.

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *