[Design Patterns] Observer Pattern

Observer được sử dụng khi chúng ta muốn tự động hóa một phương thức tương tác cập nhật giữa 1 object chủ thể và nhiều object khác tham chiếu tới. Khi object chủ thể được cập nhật trạng thái, các object tham chiếu tới sẽ được thông báo ngay khi sự kiện xảy ra. Observer

Observer được sử dụng khi chúng ta muốn tự động hóa một phương thức tương tác
cập nhật giữa 1 object chủ thể và nhiều object khác tham chiếu tới. Khi object chủ thể
được cập nhật trạng thái, các object tham chiếu tới sẽ được thông báo ngay khi sự kiện
xảy ra. Observer được xếp vào nhóm các pattern Hành Vi.

Áp dụng triển khai

sơ đồ các class

Ở đây chúng ta lấy ví dụ về một mạng xã hội chia sẻ video mà ở đó mỗi kênh Channel
là một object chủ thể được quan sát subscribe bởi nhiều object người dùng User
tham chiếu tới. Khi Channel đăng tải một video mới, một sự kiện sẽ được phát động
để thông báo cho tất cả các User đã đăng ký kênh.

Bước 1

Tạo abstract Observed chủ thể được quan sát, và abstract Observer tham chiếu tới
object chủ thể. Cả 2 đối tượng “được quan sát” và “người quan sát” đều xuất hiện cùng lúc
nên chúng ta có thể định nghĩa cái nào trước cũng được.

observerpattern/Observer.java

packageobserverpattern;publicabstractclassObserver{publicabstractvoidonEvent(String event,Object data);}

observerpattern/Observed.java

packageobserverpattern;importjava.util.ArrayList;importjava.util.List;publicabstractclassObserved{protectedList<Observer> observerList;publicObserved(){
      observerList =newArrayList<Observer>();}publicvoidaddObserver(Observer o){
      observerList.add(o);}publicabstractvoiddispatchEvent(String event,Object data);}

Bước 2

Tạo các class mô tả thực thể của phần mềm quản lý mạng xã hội chia sẻ video bao gồm:
Video, Channel kế thừa Observed, và User kế thừa Observer.

observerpattern/Video.java

packageobserverpattern;publicclassVideo{privateString name;publicVideo(String name){this.name = name;}publicStringgetName(){return name;}}

observerpattern/Channel.java

packageobserverpattern;importjava.util.ArrayList;importjava.util.List;publicclassChannelextendsObserved{privateString name;privateList<Video> videoList;publicChannel(String name){super();this.name = name;
      videoList =newArrayList<Video>();}@OverridepublicvoidaddObserver(Observer o){
      observerList.add(o);}@OverridepublicvoiddispatchEvent(String event,Object data){
      observerList.stream().forEach((subscriber)-> subscriber.onEvent(name +" "+ event, data));}publicvoidaddNewVideo(Video v){
      videoList.add(v);dispatchEvent("added new video", v);}publicvoidaddSubscriber(User u){addObserver((Observer) u);}}

observerpattern/User.java

packageobserverpattern;publicclassUserextendsObserver{privateString name;publicUser(String name){this.name = name;}@OverridepublicvoidonEvent(String event,Object data
   ){System.out.println("=== User: "+ name);System.out.println("Notification: "+ event +" "+((Video) data).getName());}publicvoidsubscribe(Channel c){
      c.addSubscriber(this);}}

Bước 4

Viết code main để kiểm tra hoạt động của phần mềm.

PatternDemo.java

importobserverpattern.Channel;importobserverpattern.User;importobserverpattern.Video;publicclassPatternDemo{publicstaticvoidmain(String[] args){Channel theCoder =newChannel("The Coder");User john =newUser("John");
      john.subscribe(theCoder);User ryan =newUser("Ryan");
      ryan.subscribe(theCoder);

      theCoder.addNewVideo(newVideo("Design Patterns"));
      theCoder.addNewVideo(newVideo("Observer Pattern"));}}

Bước 5

Kiểm chứng lại kết quả được in ra ở console.

console

===User:JohnNotification:TheCoder added new video DesignPatterns===User:RyanNotification:TheCoder added new video DesignPatterns===User:JohnNotification:TheCoder added new video ObserverPattern===User:RyanNotification:TheCoder added new video ObserverPattern

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th