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

Ngày đăng: 2023-05-05 12:22:43

Mục lục

1.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 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.

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.

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.

ISubject.cs

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.

Subject.cs

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.

IObserver.cs

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.

Observer.cs

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ả.

Program.cs

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 thuanhoaonline.com");

            Console.Read();

        }

    }

}

Kết quả:

 

Về bài trước...

                                  Bài tiếp theo...


Tài liệu lập trình C#

Bài viết trong cùng chuyên mục

Góc games giải trí (chơi trực tiếp trên web) Đăng nhập (chơi có thưởng)



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Bắn bóng

Plapy Bird (NH.Đông)

Vượt chướng ngại vật

Vẽ hình cứu người

Game Phases

Game vui chơi có thưởng

Game bắn cá



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

8474