Observer Pattern la gi?
Observer Pattern la gi?

Học Design Pattern: Observer Pattern – Luôn Luôn Lắng Nghe Luôn Luôn Thấu Hiểu

Observer Pattern là 1 mẫu thiết kế quan trọng, nó đưa ra 1 giải pháp cho việc nhận và xử lý những sự thay đổi trên 1 luồng dữ liệu nhất định bằng cách Observe (giám sát) lên luồng dữ liệu đó.

Một luồng dữ liệu có thể có 0, 1 hoặc nhiều đối tượng đang Observe lên. Và khi luồng dữ liệu có sự thay đổi, tất cả các Observer đều sẽ nhận được thông tin này để có thể thực thi các logic cần thiết tương ứng.

Vấn Đề Trong Phần Mềm

Giả sử anh em là Dev của sàn TMDT, trên app Mobile của sàn này có tính năng cho phép khách hàng có thể đăng ký sớm một Flash Sale Event. Và Flash Sale Event này có thể được hàng nghìn khách hàng đăng ký cùng 1 lúc. Khi nào có sự kiện diễn ra, thiết bị Mobile của khách hàng sẽ nhận được thông báo sớm hơn 15 phút để chuẩn bị vào mua hàng.

Làm sao để 1000 khách hàng đều nhận được thông báo đúng thời điểm đây? Tạo 1000 vòng while(true) để check xem khi nào đến lúc Flash Sale thì gửi thông báo á? Điên rồ thật!!! Phải dùng Observer Pattern thôi!

Giải Quyết Với Observer Pattern

Với Observer Pattern, chúng ta có 2 khái niệm Subscriber và Publisher.

Sự kiện Flash Sale đóng vai trò là Publisher, còn Khách hàng chính là những Subscriber chất nước cất. Khách hàng mỗi khi muốn nhận thông báo chỉ cần đăng ký (subscribe) vào Flash Sale Event, chỉ cần đến đúng lúc diễn ra sự kiện thì Publisher (Flash Sale Event) sẽ gửi một Event (Notification) đến từng khách hàng 1 để không ai phải bỏ lỡ kèo Flash Sale có 1 0 2 này!!!

Code Mẫu Cho Observer Pattern

interface Subscriber {
  fun receive(data: String)
}
interface Publisher {
  fun addSubscriber(s: Subscriber)
  fun removeSubscriber(s: Subscriber)
  fun publishEvent(data: String)
}

class FlashSale(val name: String) : Publisher {
  val subscribers = MutableSet<Subscriber>()
  override fun addSubscriber(s: Subscriber) {
    subscribers.add(s)
  }
  override fun removeSubscriber(s: Subscriber) {
    subscribers.remove(s)
  }
  override fun publishEvent(data: String) {
    subscribers.foreach {
      it.receive(data)
    }
  }
}

class Customer(val name: String) : Subscriber {
  fun subscribeToFlashSale(flashSale: FlashSale) {
    flashSale.addSubscriber(this)
  }
  override fun receive(data: String) {
    println(data)
  }
}

fun main() {
  val flashSale = FlashSale("Sale 9-9")
  val customer = Customer("Dan Tech")
  customer.subscribeToFlashSale(flashSale)
  flashSale.publishEvent("Sale Zo zo")
}

Khi nào nên sử dụng Observer Pattern

Khi các thay đổi đối với trạng thái của một Object có thể yêu cầu thay đổi các Object khác.

Có thể ví dụ như trong lập trình Mobile, Web kiến trúc hiện tại chúng ta hay dùng hook để quan sát state của 1 Component, đây chính là Observer Pattern.

Hãy theo dõi kênh YoutubeFacebook của mình để cập nhật thêm nhiều kiến thức nha!
@dantech