Observer Là Gì

     

Ý Đồ

Observer là một behavioral thiết kế pattern (sau đây điện thoại tư vấn tắt là DP) dùng làm định nghĩa một cơ chế đk (subscribe) nhằm thông báo (notify) mang lại nhiều đối tượng người dùng về những sự kiện xảy ra với đối tượng người dùng mà bọn chúng đang quan sát (observe).

Bạn đang xem: Observer là gì

*

Vấn đề

Tưởng tượng rằng chúng ta có hai các loại đối tượng: khách hàng và cửa hàng. Quý khách rất để ý đến một thương hiệu sản phẩm cụ thể (giả sử là 1 mẫu iPhone mới) sẵn sàng được bày chào bán tại cửa ngõ hàng.

Khách hàng có thể ghé thăm shop mỗi ngày để kiểm soát đã có thành phầm chưa. Tuy vậy trong khi sản phẩm vẫn không được tung ra, phần nhiều những chuyến hành trình tới siêu thị này đang là vô nghĩa.

*

Mặt khác, cửa hàng có thể gửi hàng tấn email (mà sẽ có người sử dụng nghĩ là thư rác) mang đến tất cả người tiêu dùng mỗi khi có thành phầm mới. Điều này sẽ giúp một số người sử dụng đỡ cần mất công đến cửa hàng vô số lần, mặc dù nhiên, đồng thời, vấn đề này sẽ làm tức giận những khách hàng khác không để ý đến sản phẩm mới.

Có vẻ như có một sự xung đột xảy ra ở đây. Hoặc là người tiêu dùng lãng phí thời hạn kiểm tra xem thành phầm đã tất cả hàng hay chưa, hoặc là shop lãng tổn phí nguồn lực khi thông tin cho quý khách hàng không ao ước nhận thông báo.

Giải pháp

Đối tượng mà lại có một số trong những trạng thái mà đối tượng khác quan tâm thường được call là subject, nhưng vị nó cũng sẽ thông báo cho các đối tượng người tiêu dùng khác về những biến đổi đối với tâm lý của nó, công ty chúng tôi sẽ call nó là publisher. Tất cả các đối tượng người tiêu dùng khác ý muốn theo dõi các thay đổi đối với tinh thần của publisher được điện thoại tư vấn là subscribers.

Observer DP nhắc nhở rằng họ nên thêm lý lẽ subscribe vào class quảng cáo trên internet để các đối tượng người tiêu dùng riêng lẻ hoàn toàn có thể subscribe hoặc hủy subscribe khỏi luồng sự kiện đến từ publisher đó. Nghe có vẻ như phức tạp, nhưng thực tế sẽ đơn giản hơn các bạn nghĩ đấy

*

Giờ đây, bất cứ khi nào một sự kiện đặc trưng xảy ra với publisher, quảng cáo trên internet sẽ chạy qua mảng subscriber cùng gọi cách tiến hành thông báo rõ ràng của các đối tượng ấy.

Các áp dụng thực hoàn toàn có thể có hàng trăm class subscriber khác nhau để ý đến việc theo dõi những sự kiện của và một class publisher. Vào trường đúng theo này, họ không đề nghị couple publisher vào tất cả các class đó. Kề bên đó, bạn cũng có thể thậm chí chần chừ trước về một số trong những trong số đông đảo class đó nếu class quảng cáo online của họ viết ra với mục tiêu được tín đồ khác sử dụng.

Đó là tại sao tại sao điều đặc biệt quan trọng là tất cả các subscriber đề xuất implement cùng một giao diện và quảng cáo online chỉ giao tiếp với các subscriber qua đồ họa đó. Giao diện này đề xuất khai báo phương thức thông tin cùng với một tập hợp những tham số cơ mà publisher có thể sử dụng để chuyển một trong những dữ liệu theo ngữ cảnh cùng rất thông báo.

*

Nếu ứng dụng của bạn có rất nhiều loại publisher khác biệt và bạn muốn làm đến subscriber tương hợp với toàn bộ các publisher, bạn cũng có thể làm cho tất cả các advertiser follow và một giao diện. Hình ảnh này chỉ việc mô tả một số cách thức subscribe. đồ họa sẽ được cho phép subscriber quan gần kề trạng thái của quảng cáo online mà ko couple đến các class rõ ràng của publisher.

Ví von với thực tế

*

Nếu chúng ta subscribe một tờ báo hoặc tạp chí, bạn không nhất thiết phải đến siêu thị để soát sổ xem số tiếp theo sau đã gồm hay không. Cố gắng vào đó, bên xuất bạn dạng sẽ gửi những số báo new trực sau đó hộp thư của người tiêu dùng ngay sau thời điểm xuất bản hoặc thậm chí còn trước.

Nhà xuất bạn dạng giữ danh sách những người đăng cam kết và biết họ suy nghĩ tạp chí nào. Người đăng ký hoàn toàn có thể rời khỏi danh sách ngẫu nhiên lúc nào khi họ không muốn nhà xuất phiên bản gửi các số tạp chí new cho họ nữa.

Cấu trúc

*

Publisher bắn những sự kiện mà lại các đối tượng người sử dụng khác quan tiền tâm. Phần đa sự khiếu nại này xảy ra khi publisher đổi khác trạng thái hoặc thực hiện một vài hành vi. Quảng cáo trên internet có phép tắc subscribe chất nhận được đối tượng ra/vào danh sách subscriber.

Khi một sự kiện bắt đầu xảy ra, advertiser duyệt qua list subscriber và gọi phương thức thông tin được khai báo trong giao diện subscriber của từng đối tượng người sử dụng subscriber.

Giao diện Subscriber khai báo giao diện thông báo. Trong số đông các ngôi trường hợp, nó bao gồm chỉ một cách tiến hành là update. Phương thức có thể có một số tham số có thể chấp nhận được publisher pass một số chi tiết sự kiện cùng với việc kiện cập nhật.

Class Subscriber rõ ràng thực hiện tại một số hành vi để phản hồi lại các thông tin do quảng cáo online đưa ra. Tất cả các lớp này buộc phải implement cùng một bối cảnh để publisher không phải couple với các class nuốm thể.

Xem thêm: Đèn Pin Xe Đạp Siêu Sáng Chống Nước, Top 5+ Đèn Led Xe Đạp Tốt Nhất

Thông thường, subscriber cần một số thông tin theo văn cảnh để cách xử trí sự kiện update một cách thiết yếu xác. Vì nguyên nhân này, publisher thường chuyển một trong những dữ liệu ngữ cảnh làm cho param của cách làm thông báo. Publisher rất có thể pass chủ yếu nó như 1 param, cho phép subscriber thẳng fetch bất kỳ dữ liệu nào mà lại nó cần.

Client tạo nên các đối tượng người tiêu dùng publisher cùng subscriber riêng lẻ và tiếp nối subscribe subscriber vào quảng cáo trên internet để lắng tai các cập nhật của publisher.

Giả mã

Danh sách subscriber được biên dịch động: Các đối tượng người sử dụng có thể bắt đầu hoặc giới hạn nghe thông báo tại runtime, tùy thuộc vào hành vi ước muốn của vận dụng của bạn.

Trong cách triển khai này, class editor không tự lưu list subscribe. Nó ủy thác quá trình này cho đối tượng helper đặc trưng dành riêng biệt cho việc đó. Bạn có thể nâng cấp đối tượng người dùng đó để trở thành nó thành một sự kiện dispatcher tập trung, cho phép ngẫu nhiên đối tượng nào vận động như một publisher.

Việc thêm subscriber bắt đầu vào chương trình không yêu cầu biến hóa đối với những lớp advertiser hiện có, miễn là chúng hoạt động với toàn bộ subscriber thông qua cùng một giao diện.

Tính ứng dụng

*** thực hiện mẫu Observer khi các thay đổi đối với tâm lý của một đối tượng có thể yêu mong việc chuyển đổi các đối tượng người dùng khác cùng danh sách đối tượng người dùng trong thực tiễn không được biết trước hoặc gồm thể biến đổi động.**Bạn thông thường sẽ có thể gặp gỡ vấn đề này khi thao tác làm việc với những class GUI. Ví dụ: bạn đã tạo các class button custom và bạn muốn cho phép client kết nối một vài code custom vào các button đó nhằm code ấy kích hoạt bất cứ khi nào người cần sử dụng nhấn vào trong 1 button.Observer DP mang đến phép ngẫu nhiên đối tượng nào tiến hành giao diện subscriber subscribe để nhận thông báo sự khiếu nại từ đối tượng publisher. Bạn có thể thêm bề ngoài subscribe vào những nút của mình, cho phép client liên kết code custom của họ trải qua các lớp subscriber custom.

*** thực hiện DP này khi 1 số đối tượng người sử dụng trong ứng dụng của bạn phải quan ngay cạnh những đối tượng người dùng khác, tuy vậy chỉ trong thời hạn giới hạn hoặc trong những trường hợp nỗ lực thể.**Danh sách subscribe là động, vày vậy subscriber rất có thể vào hoặc thoát ra khỏi danh sách bất cứ lúc nào nó cần.

Cách implement

Quan tiếp giáp business logic của chúng ta và nỗ lực chia nó thành nhì phần: chức năng cốt lõi, độc lập với mã không giống -> phần này đang là publisher; phần sót lại sẽ trở thành tập các class subscriber.Khai báo bối cảnh subscriber. Ở mức buổi tối thiểu, nó buộc phải khai báo một phương thức update.Khai báo giao diện quảng cáo online và mô tả hai cách tiến hành là thêm đối tượng subscriber với xóa đối tượng đó khỏi danh sách. Hãy nhớ rằng publisher chỉ được thiết kế việc cùng với subscriber qua đồ họa subscriber.Quyết định vị trí đặt list subscribe thực tế và việc triển khai các phương thức subscribe. Thông thường, code này sẽ giống nhau với tất cả các nhiều loại publisher, vày đó, vị trí cụ thể để để nó là trong một tờ trừu tượng inherit trực tiếp từ hình ảnh publisher. Class publisher rõ ràng extend class đó, thừa kế hành vi subscribe.Tuy nhiên, nếu như khách hàng đang áp dụng DP này cho khối hệ thống class hiện tại có, hãy xem xét biện pháp tiếp cận dựa vào composition: đặt logic subscribe vào một đối tượng hiếm hoi và khiến tất cả những publisher thực áp dụng nó.Tạo những class quảng cáo trên internet cụ thể. Mỗi lúc có điều gì quan trọng xảy ra bên phía trong publisher, publisher sẽ phải thông tin cho tất cả những subscriber của mình.Implement những phương thức thông báo cập nhật trong những lớp subscriber rứa thể. Hầu hết subscriber sẽ cần một vài dữ liệu ngữ cảnh về sự kiện. Tài liệu đó có thể được pass vào có tác dụng một param của cách tiến hành thông báo.Nhưng có một sàng lọc khác, đó là khi nhận được thông báo, subscriber có thể lấy bất kỳ dữ liệu nào trực tiếp từ bỏ thông báo. Vào trường vừa lòng này, quảng cáo trên internet phải từ bỏ pass bao gồm nó trải qua qua phương thức update. Tùy chọn kém linh hoạt rộng là links nhà xuất bạn dạng với subscriber vĩnh viễn thông qua phương thức khởi tạo.Client cần tạo tất cả subscriber quan trọng và subscribe bọn chúng với những publisher phù hợp hợp.

Ưu cùng nhược điểm

Ưu 1: Open/Closed Principle: chúng ta có thể thêm các class subscriber mới mà không đề nghị phải thay đổi code của class quảng cáo trên internet (và ngược lại nếu có giao diện publisher).Ưu 2: chúng ta có thể thiết lập quan hệ giữa các đối tượng người dùng tại runtime.Nhược: Không điều hành và kiểm soát được đồ vật tự subscriber dấn thông báo.

Mối dục tình với những DP khác

Chain of Responsibility, Command, Mediator và Observer là những cách giải quyết khác nhau cho bài xích toán kết nối người nhờ cất hộ và fan nhận yêu cầu:Chain of Responsibility gửi một yêu cầu tuần tự dọc từ một chuỗi động gồm những người dân nhận tiềm năng cho tới khi một trong những chúng cách xử trí yêu cầu đó.Command tùy chỉnh kết nối một chiều giữa tín đồ gửi và người nhận.Mediator loại bỏ các liên kết trực tiếp giữa tín đồ gửi và fan nhận, buộc họ phải tiếp xúc gián tiếp trải qua một đối tượng người dùng trung gian.Observer có thể chấp nhận được người nhận đăng ký động cùng hủy đăng ký nhận yêu thương cầu.

Sự khác biệt giữa Mediator và Observer thường xuyên không lớn trong nhiều trường hợp. Trong đa số các ngôi trường hợp, bạn cũng có thể implement một trong những DP này; tuy thế đôi khi chúng ta cũng có thể áp dụng mặt khác cả hai. Hãy xem cách công ty chúng tôi làm điều đó.

Mục tiêu thiết yếu của Mediator là vứt bỏ sự phụ thuộc vào lẫn nhau giữa một tập hợp các thành phần nằm trong hệ thống. Chũm vào đó, những thành phần này trở nên dựa vào vào một đối tượng trung gian duy nhất. Kim chỉ nam của Observer là tùy chỉnh thiết lập các liên kết động một chiều giữa các đối tượng, vào đó một số trong những đối tượng vận động như cấp cho dưới của những đối tượng người sử dụng khác.

Có một cách triển khai thông dụng của Mediator mà nhờ vào Observer. Đối tượng mediator đóng vai trò là quảng cáo online và các thành phần nhập vai trò là subscriber subscribe với hủy subscribe những sự kiện của mediator. Khi Mediator được implement theo phong cách này, nó rất có thể trông khôn cùng giống với Observer.

Khi bạn thấy cực nhọc hiểu, hãy ghi nhớ rằng bạn cũng có thể implement Mediator theo các phương pháp khác. Ví dụ: chúng ta cũng có thể liên kết vĩnh viễn tất cả các component với thuộc một đối tượng người sử dụng Mediator. Việc tiến hành này sẽ không giống với Observer nhưng mà vẫn sẽ là một phiên bản của Mediator.

Xem thêm: Lá Lard Là Gì ? Sự Khác Biệt Giữa Lard Và Shortening

Bây tiếng hãy tưởng tượng một lịch trình mà toàn bộ các component đang trở thành publisher, có thể chấp nhận được các kết nối động thân nhau. Sẽ không có đối tượng người sử dụng mediator tập trung, chỉ có một nhóm observer phân tán.