sách gpt4 ăn đã đi

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 25 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát viên? Được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm tới bài viết này thì nhớ like nhé.

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

Hàng đợi tin nhắn (MQ), một mô hình truyền thông có thể đạt được giao tiếp một chiều từ nhà sản xuất đến người tiêu dùng, cũng là một phần mềm trung gian phổ biến được sử dụng phổ biến hiện nay.

Những cái phổ biến bao gồm RabbitMQ, ActiveMQ, Kafka, v.v. Chúng cũng có nhiều ưu điểm như tách rời, không đồng bộ, phát sóng, cắt đỉnh, v.v.

Ngoài ra còn có một mẫu trong các mẫu thiết kế có thể đạt được các đặc điểm tách rời và không đồng bộ một cách hiệu quả, đó là mẫu người quan sát, còn được gọi là mẫu đăng ký xuất bản.

Hôm nay A Bing sẽ chia sẻ mô hình này phổ biến hơn trong quá trình phát triển thực tế.

Đề cương.

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

sự định nghĩa

  。

Mẫu quan sát là gì? Mục đích của nó là gì?

  • Khi trạng thái của một đối tượng thay đổi, các đối tượng đã đăng ký khác có thể quan sát sự thay đổi và thực hiện các thay đổi tương ứng của riêng mình. Bằng cách này, đạt được hiệu quả giảm sự phụ thuộc và tách rời.

Để đưa ra một ví dụ, nó giống như WeChat Moments, với cá nhân hiện tại là người đăng ký và bạn bè là chủ đề. Khi một người đăng vòng tròn bạn bè động, tất cả bạn bè của người đó có thể nhìn thấy vòng kết nối bạn bè này và có thể chọn thích hoặc bình luận về nó.

Có vẻ hơi trừu tượng, vì vậy hãy cùng xem qua vai trò chính của anh ấy:

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

  • Chủ đề: Một giao diện có thể quan sát chủ yếu được triển khai bởi một lớp, thông báo cho người quan sát sử dụng phương thức đính kèm và phương thức tách để hủy quan sát.
  • ConcreteSubject (chủ đề cụ thể): là lớp thực hiện giao diện chủ đề và xử lý các thay đổi trong trình quan sát
  • Quan sát: Người quan sát là một giao diện được hỗ trợ bởi một đối tượng được cập nhật dựa trên những thay đổi trong chủ đề.

Không có nhiều vai trò theo cách này, nhưng nó vẫn có vẻ hơi trừu tượng. Hãy cùng xem qua mã ví dụ cụ thể.

  1. công cộng giao diện Chủ đề { 
  2.     // Thêm mối quan hệ đăng ký 
  3.     void attach(Người quan sát); 
  4.     //Xóa mối quan hệ đăng ký 
  5.     void tách ra(Người quan sát); 
  6.     // Thông báo cho người đăng ký 
  7.     void notifyObservers(Chuỗi tin nhắn); 

Đầu tiên hãy tạo định nghĩa chủ đề, xác định các mối quan hệ thêm và xóa và thông báo cho người đăng ký.

  1. công cộng lớp ConcreteSubject triển khai Subject { 
  2.  
  3.     // Vùng chứa người đăng ký 
  4.     private List observers = new ArrayList(); 
  5.  
  6.     @Ghi đè 
  7.     công cộng void attach(Người quan sát người quan sát) { 
  8.         // Thêm mối quan hệ đăng ký 
  9.         người quan sát.thêm vào(người quan sát); 
  10.     } 
  11.  
  12.     @Ghi đè 
  13.     công cộng void tách ra(Người quan sát người quan sát) { 
  14.         //Xóa mối quan hệ đăng ký 
  15.         observers.remove(người quan sát); 
  16.     } 
  17.  
  18.     @Ghi đè 
  19.     công cộng void notifyObservers(Chuỗi tin nhắn) { 
  20.         // Thông báo cho người đăng ký 
  21.          (Người quan sát người quan sát: người quan sát) { 
  22.             người quan sát.cập nhật(tin nhắn); 
  23.         } 
  24.     } 

Tiếp theo, tạo một chủ đề cụ thể và xây dựng vùng chứa để duy trì mối quan hệ đăng ký, hỗ trợ thêm và xóa mối quan hệ cũng như thông báo cho người đăng ký.

  1. công cộng giao diện Observer { 
  2.     // Xử lý logic nghiệp vụ 
  3.     vô hiệu cập nhật(Tin nhắn chuỗi); 

Tạo giao diện người quan sát để hỗ trợ việc quản lý của chúng tôi.

  1. công cộng lớp FriendOneObserver triển khai Observer { 
  2.     
  3.   @Ghi đè 
  4.     công cộng vô hiệu cập nhật(Tin nhắn chuỗi) { 
  5.         // Mô phỏng xử lý logic nghiệp vụ 
  6.         Hệ thống.ngoài.println("FriendOne biết bạn đã gửi tin nhắn" + tin nhắn); 
  7.     } 

Bước cuối cùng là tạo một lớp người quan sát cụ thể, triển khai phương thức cập nhật của giao diện người quan sát và xử lý logic nghiệp vụ của chính nó.

  1. công cộng kiểm tra lớp { 
  2.      
  3.     công cộng tĩnh void main(String[] args) { 
  4.  
  5.         ConcreteSubject chủ đề = new ConcreteSubject(); 
  6.         // Ở đây chúng ta giả định rằng chúng ta đang thêm bạn bè 
  7.         chủ đề.attach(new FriendOneObserver()); 
  8.         FriendTwoObserver twoObserver = new FriendTwoObserver(); 
  9.         chủ đề.attach(twoObserver); 
  10.  
  11.         //Gửi cập nhật tới Khoảnh khắc 
  12.         chủ đề.thông báoNgười quan sát("Tin nhắn khoảnh khắc đầu tiên"); 
  13.         //Kết quả đầu ra: FriendOne biết bạn đã đăng tin Khoảnh khắc đầu tiên 
  14.         // FriendTwo biết bạn đã đăng tin nhắn Khoảnh khắc đầu tiên 
  15.  
  16.         // Ở đây thấy twoObserver là người bán trà được đề xuất, xóa bạn đi 
  17.         chủ thể.tách(twoObserver); 
  18.         chủ đề.thông báoNgười quan sát("Tin nhắn khoảnh khắc thứ hai"); 
  19.         // Kết quả đầu ra: FriendOne biết rằng bạn đã đăng tin nhắn Khoảnh khắc thứ hai 
  20.     } 

Bước cuối cùng là xem kết quả kiểm tra. Mối quan hệ đăng ký được duy trì thông qua ConcreteSubject. Sau khi thông báo cho người đăng ký thông qua phương thức notificationObservers, người quan sát sẽ nhận được thông báo và xử lý logic nghiệp vụ của riêng họ.

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

Những người bạn cẩn thận ở đây đã đạt được hiệu quả trong việc hiểu sự ghép nối và cũng giảm bớt sự phụ thuộc. Mỗi người quan sát không cần biết nhà xuất bản xử lý logic kinh doanh gì, cũng như không cần dựa vào bất kỳ mô hình kinh doanh nào của nhà xuất bản. Nó chỉ quan tâm đến logic của nó. cần phải xử lý.

Nếu một doanh nghiệp mới được thêm vào, chúng tôi chỉ cần tạo một người đăng ký mới và duy trì nó trong vùng chứa người quan sát, điều này cũng phù hợp với nguyên tắc mở và đóng của chúng tôi.

Đây chỉ là cách triển khai đồng bộ. Chúng tôi cũng có thể mở rộng các triển khai không đồng bộ khác hoặc sử dụng đa luồng và các cách triển khai khác.

Ứng dụng khung

  。

Cũng cần có nhiều ứng dụng của mẫu người quan sát trong khuôn khổ này.

  • Loại người đầu tiên làm quen với JDK nên biết rằng ngoài các bộ sưu tập và bản đồ thường được sử dụng, còn có một lớp có thể quan sát được trong gói java.util. Việc triển khai nó thực sự là mẫu quan sát. Ngoài ra còn có các phương pháp thêm, xóa và thông báo.

Cần lưu ý ở đây rằng anh ấy sử dụng Vector làm nơi chứa mối quan hệ đăng ký và thêm từ khóa được đồng bộ hóa vào phương thức định nghĩa của mình để sửa đổi lớp nhằm đạt được sự an toàn của luồng.

Tôi đã đăng mã nguồn chính tại đây. Học viên quan tâm có thể tự mở và xem nhận xét của từng phương pháp.

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

Phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát?

  • Loại thứ hai có ApplicationListener trong Spring, cũng được xử lý bằng mẫu quan sát. ApplicationEventMulticaster được sử dụng làm chủ đề, bao gồm thêm, xóa, thông báo, v.v.

Spring có một số sự kiện được xây dựng sẵn khi một thao tác nào đó được hoàn thành, một số hành động sự kiện nhất định sẽ được đưa ra. Tất nhiên, còn nhiều sự kiện khác nữa. Tìm hiểu kỹ quá trình khởi động Spring.

import java.util.EventListener;/** * Giao diện được triển khai bởi trình xử lý sự kiện của ứng dụng * Dựa trên giao diện {@code java.util.EventListener} tiêu chuẩn * cho mẫu thiết kế Observer // Nó cũng đã được nêu ở đây. rằng nó được sử dụng Mẫu quan sát* *.

  1. nhập java.util.EventListener; 
  2.  
  3. /** 
  4.  * Giao diện ĐẾN được thực hiện qua trình lắng nghe sự kiện ứng dụng. 
  5.  * Dựa trên TRÊN giao diện {@code java.util.EventListener} chuẩn 
  6.  *   mẫu thiết kế Observer. // Ở đây cũng đã giải thích rằng mẫu Observer được sử dụng. 
  7.  * 
  8.  *BẰNG của Spring 3.0, ApplicationListener có thể nói chung chung tuyên bố loại sự kiện 
  9.  * rằng nó  thú vị TRONGKhi đăng ký với một Spring ApplicationContext, các sự kiện 
  10.  * sẽ được lọc theo đó, với người nghe được gọi đến  sự kiện phù hợp 
  11.  * các đối tượng chỉ một
  12.  * 
  13.  * @tác giả Rod Johnson 
  14.  * @author Juergen Hoeller 
  15.  * @param lớp con ApplicationEvent cụ thể ĐẾN Nghe ĐẾN 
  16.  * @see org.springframework.context.event.ApplicationEventMulticaster // Xem thêm 
  17.  */ 
  18. @Giao diện chức năng 
  19. công cộng giao diện ApplicationListener mở rộng EventListener { 
  20.  
  21.  /** 
  22.   * Xử lý sự kiện ứng dụng. 
  23.   * @param sự kiện sự kiện ĐẾN trả lời ĐẾN 
  24.   */ 
  25.  void onApplicationEvent(Sự kiện E); 
  26.  
  • Cơ chế xử lý sự kiện Google Guava thứ ba, Guava EventBus, cũng được triển khai bằng cách sử dụng mẫu thiết kế quan sát trong mẫu thiết kế.

EventBus hiện được triển khai theo hai cách:

  • EventBus // Chế độ chặn đồng bộ
  • AsyncEventBus // // Chế độ không chặn không đồng bộ

EventBus cũng cung cấp một loạt các phương thức nội bộ để thuận tiện cho chúng tôi:

  • đăng ký phương thức như thêm người quan sát
  • phương pháp hủy đăng ký xóa người quan sát
  • Phương thức post gửi tin nhắn thông báo, v.v.

Nó rất thuận tiện để sử dụng. Bạn có thể tạo người đăng ký bằng cách thêm chú thích @Subscribe Để biết cách sử dụng cụ thể, vui lòng xem trang web chính thức.

Ví dụ về chuyển đổi kinh doanh thực tế

  。

Có rất nhiều ví dụ về ứng dụng khung và thực tế có nhiều nơi có thể sử dụng nó trong các tình huống kinh doanh. Ở đây tôi sẽ cho bạn một ví dụ.

Sau khi người dùng mới đăng ký thành công, chúng tôi cần thực hiện hai việc cho người dùng. Đầu tiên là gửi thông báo đăng ký thành công và thứ hai là gửi phiếu giảm giá cho người dùng mới.

Khi gặp vấn đề này, trước tiên bạn có thể nghĩ đến việc sử dụng xử lý thông báo MQ. Đúng, thực sự có thể sử dụng thông báo, nhưng ở đây chúng tôi sử dụng chế độ quan sát viên để thực hiện vấn đề này, đồng thời, chúng tôi có thể chứng minh cho bạn thấy vấn đề đồng bộ hóa hoặc không đồng bộ.

  1. công cộng lớp SendNewPersonCouponObserver triển khai Observer { 
  2.  
  3.     Nhóm ExecutorService = Executors.newFixedThreadPool(2); 
  4.  
  5.     @Ghi đè 
  6.     công cộng vô hiệu cập nhật(Tin nhắn chuỗi) { 
  7.  
  8.         Future future = pool.submit(new Callable() { 
  9.             @Ghi đè 
  10.             công cộng Chuỗi call() ném ra ngoại lệ { 
  11.                 Đơn vị thời gian.GIÂY.ngủ(3); 
  12.                 // Logic nghiệp vụ để xử lý phản hồi 
  13.                 trở lại "Gọi dịch vụ phát hành phiếu giảm giá và trả kết quả"
  14.             } 
  15.         }); 
  16.         thử { 
  17.             // Giả sử sau khi đợi 200 mili giây, nếu không nhận được giá trị trả về thì coi như thất bại. 
  18.             Hệ thống.ngoài.println(future.get(4000, Đơn vị thời gian.MILLIGIÂY)); 
  19.         } catch (Ngoại lệ e) { 
  20.             // Không thể thực hiện việc thu thập không đồng bộ 
  21.             // Ghi nhật ký, thử lại các tác vụ đã lên lịch, v.v. 
  22.         } 
  23.  
  24.         // Cái đầu tiên không quan tâm đến giá trị và kết quả trả về 
  25.         Luồng luồng = Luồng mới (Có thể chạy mới() { 
  26.             @SneakyThrows 
  27.             @Ghi đè 
  28.             công cộng lệnh chạy() { 
  29.                 // Mô phỏng cuộc gọi dịch vụ, luồng ngủ trong 3 giây 
  30.                 Đơn vị thời gian.GIÂY.ngủ(3); 
  31.                 Hệ thống.ngoài.println("Gửi phiếu giảm giá cho người mới"); 
  32.             } 
  33.         }); 
  34.         thread.bắt đầu(); 
  35.         Hệ thống.ngoài.println("Thực hiện trả về không đồng bộ"); 
  36.     } 

  1. công cộng lớp SendSuccessMessageObserver triển khai Observer { 
  2.  
  3.     @Ghi đè 
  4.     công cộng vô hiệu cập nhật(Tin nhắn chuỗi) { 
  5.         // Xử lý logic nghiệp vụ 
  6.         Hệ thống.ngoài.println("Đăng ký thành công"); 
  7.     } 
  8.  
  9.     công cộng tĩnh void main(String[] args) { 
  10.         // Giả sử người dùng đã đăng ký thành công, người quan sát sẽ được thông báo trực tiếp và anh ta có thể tiến hành công việc riêng của mình. 
  11.         ConcreteSubject chủ đề = buildSubject(); 
  12.         chủ đề.thông báoNgười quan sát(""); 
  13.     } 
  14.   
  15.    riêng tư tĩnh ConcreteSubject xây dựngSubject() { 
  16.         ConcreteSubject chủ đề = new ConcreteSubject(); 
  17.         chủ đề.attach(new SendSuccessMessageObserver()); 
  18.         chủ đề.đính kèm(mới SendNewPersonCouponObserver()); 
  19.         trở lại chủ thể; 
  20.     } 

  。

Ở đây chúng tôi đã viết hai trình quan sát mới, chủ yếu xem xét SendNewPersonCouponObserver đầu tiên. Ở đây chúng tôi bắt đầu một luồng mới không đồng bộ để xử lý logic nghiệp vụ của mình. Khi chúng tôi quan tâm đến giá trị trả về, chúng tôi có thể sử dụng Tương lai để nhận kết quả trả về. Tuy nhiên, chúng ta có thể sử dụng Future để nhận kết quả trả về. Để thay đổi giá trị trả về, chỉ cần bắt đầu trực tiếp luồng thông thường.

Ví dụ này nhìn chung tương đối đơn giản, chủ yếu để minh họa quá trình xử lý luồng không đồng bộ. Tất nhiên, nó cũng có thể được triển khai bằng Guava EventBus. Và nó không phức tạp. Những người bạn quan tâm có thể tự mình thử.

Hiện tại, có hàng đợi tin nhắn MQ phần mềm trung gian tốt hơn để xử lý vấn đề kinh doanh này, cho phép chúng tôi đối mặt với các vấn đề kịch bản như vậy một cách bình tĩnh hơn, nhưng một số tài nguyên không đủ và chúng tôi không muốn giới thiệu một hệ thống mới. Vấn đề vẫn có thể được giải quyết theo cách này.

Những gì bạn học về mẫu thiết kế không phải là mã mà là ý tưởng của từng mẫu và kịch bản kinh doanh mà chúng xử lý tương ứng.

Tóm tắt

  。

Tôi không biết liệu bạn có phát hiện ra điều gì sau khi đọc bài viết này hay không. Trên thực tế, toàn bộ nội dung được viết xoay quanh ý tưởng tách rời. Là một mẫu thiết kế hành vi, mẫu quan sát chủ yếu nhằm mục đích tách mã. hành vi kinh doanh khác nhau.

Việc sử dụng hợp lý các mẫu thiết kế có thể làm cho cấu trúc mã rõ ràng hơn, đồng thời, nó cũng có thể đáp ứng các yêu cầu của các mô-đun nhỏ khác nhau để tuân thủ một trách nhiệm duy nhất và nguyên tắc đóng mở, từ đó đạt được các đặc điểm của việc viết mẫu nhà máy đã đề cập ở trên, cải thiện khả năng mở rộng của mã và chi phí bảo trì thấp.

Tôi là Ao Bing. Bạn càng biết nhiều, bạn càng không biết. Hẹn gặp lại lần sau.

Liên kết gốc: https://mp.weixin.qq.com/s/_hVGgJxefoVXFHFNXC-U6A.

Cuối cùng, bài viết này nói về cuộc phỏng vấn Alibaba P6+: Giới thiệu chế độ quan sát? Bài viết này chỉ vậy thôi. Nếu bạn muốn biết thêm về cuộc phỏng vấn Ali P6+: Giới thiệu chế độ quan sát? Về nội dung, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

25 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress