Observer design pattern ( python example )
Python
39
design pattern
18
White

Khôi Trọng Nguyễn viết ngày 06/10/2016

Observer pattern (python example)

1. Observer là gì :

Theo như wikipedia Observer Pattern là :

A software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. It is mainly used to implement distributed event handling systems.

Có thể hiểu Observer là một mẫu thiết kế, trong đó một đối tượng gọi là "subject" có thể quán lý và thông báo đến một list các đối tượng có liên kết đến gọi là "observer" mỗi khi có sự thay đổi trạng thái .

2. Cấu trúcalt text

Theo như cấu mẫu observer như trên hình một mẫu observer gồm các thành phần :

SUBJECT :

  • ObserverColection : Lưu trữ các observer đã được đăng ký
  • registerObserver : Đăng ký một observer với subject.
  • unregisterObserver : Hủy đăng ký một observer với subject.
  • notifyObserver : Thông báo cho các observer đã đăng ký .

Observer :

  • Là một interface được định nghĩa với một phương thức update() . Phương thức này sẽ nhận thay đổi mỗi khi có notify từ subject.

ConcreteObserver
Kế thừa Observer Interface để implement phương thức update() để nhận thông báo từ Subject mỗi khi có notify .

3. Example :

Mình sẽ sử dụng ví dụ có sẵn của wiki và thay đổi một chút để code trông rõ ràng hơn .

Đầu tiên : tạo một file observable.py và thêm code như sau :

observers = []
def register( observer):
    if not observer in observers:
        observers.append(observer)

def unregister(observer):
    if observer in self.observers:
        observers.remove(observer)

def notify_observers(*args, **kwargs):
    for observer in observers:
        observer.update(*args, **kwargs)

module observable như là subject trong mẫu observer , bao gồm một list observers và các hàm register , unregister giúp ta thêm vào hay xóa một observer.

Tiếp theo , tạo một file observer.py và add code như sau :

from abc import ABCMeta, abstractmethod
class Observer(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def update(self, *args, **kwargs):
        pass

Sử dụng Python Abstract Base Class để implement một interface class . Điều này để đảm bảo rằng những ConcreteObserver kế thừa interface này bắt buột phải implement phương thức update để nhận event từ subject .

Cuối cùng tạo file main.py để implement code còn lại .

from observable import register , notify_observers , observers
from observer import Observer

class SaiGon(Observer):

    def __init__(self):
        register(self)

    def update(self, *args, **kwargs):
        print("SaiGon received: {0}\n{1}".format(args, kwargs))

class DaNang(Observer):

    def __init__(self):
        register(self)

    def update(self, *args, **kwargs):
        print("DaNang received: {0}\n{1}".format(args, kwargs))

class HaNoi():
    def __init__(self):
        pass

    def update(self, *args, **kwargs):
        print("HaNoi received: {0}\n{1}".format(args, kwargs))

if __name__ == "__main__":
    saigon_observer = SaiGon()
    danang_observer = DaNang()
    hanoi_observer = HaNoi()
    notify_observers('Khoi', something='Sai Gon have Heavy rain')

run file main.py ta nhận được kết quả như sau :

SaiGon received: ('Khoi',)
{'something': 'Sai Gon have Heavy raining'}
DaNang received: ('Khoi',)
{'something': 'Sai Gon have Heavy raining'}

Bạn có thể thấy khi bắn một notify các class đã đăng ký observer và imlement phương thức update() đều nhận được thông báo .
Trong thực tế bạn có thể lọc các giá giá trị trong thông báo để deliver và hiện thực các thông báo theo những business khác nhau .

Như trong ví dụ trên khi SaiGon nhận thông báo heavy rain thì tốt nhất là nên ở nhà , còn DaNang thì sẽ ra đường chơi chẳng hạn .

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Khôi Trọng Nguyễn

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
Male avatar
8 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết hơn 1 năm trước
8 5
White
1 0
Mở đầu Như đã nói ở bài trước, mình đang nghiên cứu về Spark nên cần log lại một số thứ để dành sau này dùng đến :smile: Đối tượng hướng đến vẫn ...
Phạm Quốc Thắng viết gần 2 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!