Ý Đồ

Obhệ thống là một trong những behavioral design pattern (dưới đây Call tắt là DP) dùng làm quan niệm một nguyên lý ĐK (subscribe) nhằm mục tiêu thông báo (notify) đến nhiều đối tượng người dùng về những sự khiếu nại xảy ra với đối tượng người sử dụng mà lại bọn chúng vẫn quan tiền gần kề (observe).

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

*

Vấn đề

Tưởng tượng rằng chúng ta bao gồm hai nhiều loại đối tượng: Khách hàng với Thương hiệu. Khách hàng vô cùng quyên tâm đến một chữ tín thành phầm rõ ràng (mang sử là 1 trong những mẫu mã iPhone mới) sẵn sàng được bày buôn bán trên siêu thị.

Khách sản phẩm rất có thể ké thăm cửa hàng hằng ngày nhằm kiểm soát vẫn có thành phầm không. Nhưng trong lúc sản phẩm vẫn chưa được tung ra, số đông số đông chuyến du ngoạn cho tới cửa hàng này sẽ là bất nghĩa.

*

Mặt không giống, cửa hàng hoàn toàn có thể gửi hàng tấn email (mà sẽ có được người sử dụng nghĩ rằng thư rác) đến toàn bộ quý khách mỗi một khi tất cả mặt hàng mới. Điều này để giúp đỡ một trong những người sử dụng đỡ đề nghị mất công đến shop vô số lần, mặc dù, bên cạnh đó, điều đó sẽ làm cho tức giận phần đông quý khách không giống không quan tâm mang đến sản phẩm mới toanh.

Có vẻ nhỏng có một sự xung bỗng xảy ra ở chỗ này. Hoặc là quý khách lãng phí thời gian bình chọn coi sản phẩm đã tất cả hàng tuyệt chưa, Hoặc là shop lãng phí nguồn lực có sẵn khi thông báo mang đến quý khách không muốn nhấn thông báo.

Giải pháp

Đối tượng nhưng mà bao gồm một trong những tâm lý cơ mà đối tượng khác quan tâm thường xuyên được điện thoại tư vấn là subject, nhưng vày nó cũng biến thành thông tin cho những đối tượng người tiêu dùng khác về đều biến đổi đối với tâm trạng của chính nó, công ty chúng tôi sẽ gọi nó là publisher. Tất cả các đối tượng không giống mong theo dõi và quan sát những biến hóa so với tâm lý của publisher được call là subscribers.

Obhệ thống DPhường gợi nhắc rằng bọn họ đề nghị thêm lý lẽ subscribe vào class publisher nhằm các đối tượng người sử dụng biệt lập rất có thể subscribe hoặc hủy subscribe ngoài luồng sự kiện đến từ publisher đó. Nghe có vẻ tinh vi, nhưng lại thực tiễn sẽ dễ dàng và đơn giản hơn chúng ta suy nghĩ đấy

*

Giờ trên đây, bất cứ lúc nào một sự khiếu nại quan trọng xảy ra với publisher, publisher đã chạy qua mảng subscriber và điện thoại tư vấn thủ tục thông tin ví dụ của những đối tượng người dùng ấy.

Các áp dụng thực rất có thể có hàng trăm class subscriber khác biệt quyên tâm đến sự việc theo dõi những sự khiếu nại của cùng một class publisher. Trong ngôi trường phù hợp này, bọn họ không nên couple publisher vào tất cả những class đó. Trong khi, chúng ta cũng có thể thậm chí băn khoăn trước về một vài trong các các class đó giả dụ class publisher của chúng ta viết ra với mục tiêu được fan khác sử dụng.

Đó là nguyên do vì sao điều đặc biệt quan trọng là tất cả các subscriber yêu cầu implement và một giao diện và publisher chỉ tiếp xúc với các subscriber qua bối cảnh đó. Giao diện này buộc phải khai báo cách thức thông báo cùng với một tập thích hợp những tham mê số cơ mà publisher rất có thể áp dụng nhằm đưa một số tài liệu theo ngữ cảnh cùng rất thông báo.

*

Nếu áp dụng của chúng ta có không ít loại publisher không giống nhau và bạn muốn tạo cho subscriber cân xứng với tất cả các publisher, chúng ta có thể tạo cho tất cả những publisher follow cùng một đồ họa. Giao diện này chỉ việc diễn tả một số phương thức subscribe. Giao diện sẽ cho phép subscriber quan cạnh bên tâm trạng của publisher mà lại ko couple mang đến các class cụ thể 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í, các bạn không cần thiết phải mang lại siêu thị để chất vấn xem số tiếp sau đã tất cả hay không. Thay vào đó, nhà xuất bản đang gửi những số báo mới trực tiếp nối vỏ hộp thư của khách hàng ngay lập tức sau thời điểm xuất bản hoặc thậm chí còn trước.

Nhà xuất phiên bản giữ lại danh sách những người ĐK cùng biết họ quan tâm cho tạp chí làm sao. Người ĐK rất có thể rời khỏi list ngẫu nhiên dịp như thế nào khi chúng ta không thích nhà xuất bạn dạng gửi những số tạp chí bắt đầu đến họ nữa.

Cấu trúc

*

quảng cáo online phun những sự khiếu nại nhưng những đối tượng người tiêu dùng khác quyên tâm. Những sự kiện này xảy ra Lúc publisher chuyển đổi tâm trạng hoặc tiến hành một số hành vi. Publisher có phép tắc subscribe cho phép đối tượng người tiêu dùng ra/vào danh sách subscriber.

lúc một sự khiếu nại new xảy ra, publisher xem xét qua list subscriber và gọi cách tiến hành thông báo được knhị báo vào hình ảnh subscriber của từng đối tượng người sử dụng subscriber.

Giao diện Subscriber knhì báo giao diện thông báo. Trong phần lớn các trường phù hợp, nó bao gồm có một thủ tục là update. Phương thức có thể có một trong những tham số được cho phép publisher pass một vài chi tiết sự khiếu nại cùng với sự khiếu nại cập nhật.

Class Subscriber cụ thể tiến hành một trong những hành động để đánh giá lại các thông báo vị publisher chỉ dẫn. Tất cả các lớp này nên implement và một đồ họa để publisher chưa phải couple cùng với các class ví dụ.

Xem thêm: Muối Kcl Là Gì Và Tác Dụng Của Phân Kali Clorua Mop? Cách Sử Dụng?

Thông thường, subscriber bắt buộc một vài biết tin theo ngữ chình họa nhằm cách xử lý sự khiếu nại cập nhật một giải pháp đúng đắn. Vì nguyên nhân này, publisher thường gửi một trong những dữ liệu ngữ chình ảnh làm cho param của cách làm thông tin. Advertiser có thể pass bao gồm nó như một param, được cho phép subscriber thẳng fetch ngẫu nhiên dữ liệu làm sao mà nó bắt buộc.

Client chế tạo các đối tượng người tiêu dùng publisher cùng subscriber đơn lẻ với kế tiếp subscribe subscriber vào publisher nhằm 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 tiêu dùng có thể ban đầu hoặc giới hạn nghe thông báo trên runtime, tùy thuộc vào hành vi ước muốn của áp dụng của bạn.

Trong biện pháp triển khai này, class editor không tự lưu giữ list subscribe. Nó ủy thác quá trình này cho đối tượng người tiêu dùng helper quan trọng giành riêng cho bài toán đó. quý khách hàng rất có thể tăng cấp đối tượng đó để biến chuyển nó thành một event dispatcher tập trung, cho phép bất kỳ đối tượng người dùng làm sao hoạt động nhỏng một publisher.

Việc thêm subscriber mới vào chương trình ko thưởng thức biến đổi đối với các lớp publisher hiện tất cả, miễn là bọn chúng vận động cùng với toàn bộ subscriber trải qua và một bối cảnh.

Tính ứng dụng

*** Sử dụng mẫu mã ObVPS lúc những chuyển đổi đối với tâm lý của một đối tượng người sử dụng có thể những hiểu biết bài toán chuyển đổi các đối tượng không giống và list đối tượng vào thực tiễn ko được hiểu trước hoặc rất có thể biến đổi hễ.**quý khách thường xuyên rất có thể chạm mặt sự việc này Lúc thao tác làm việc với các class GUI. Ví dụ: quý khách đã chế tạo những class button custom với bạn có nhu cầu được cho phép client liên kết một số code custom vào những button đó nhằm code ấy kích hoạt bất cứ lúc nào người tiêu dùng dìm vào trong 1 button.Obhệ thống DP được cho phép ngẫu nhiên đối tượng người tiêu dùng như thế nào xúc tiến bối cảnh subscriber subscribe nhằm dìm thông báo sự kiện từ bỏ đối tượng publisher. Quý Khách rất có thể thêm cơ chế subscribe vào các nút của chính bản thân mình, chất nhận được client liên kết code custom của họ trải qua các lớp subscriber custom.

*** Sử dụng DPhường. này Lúc một vài đối tượng người sử dụng trong vận dụng của doanh nghiệp cần quan liền kề các đối tượng người sử dụng không giống, tuy thế chỉ trong thời gian giới hạn hoặc trong những ngôi trường phù hợp cụ thể.**Danh sách subscribe là đụng, bởi vì vậy subscriber hoàn toàn có thể vào hoặc thoát ra khỏi danh sách bất kể lúc nào nó buộc phải.

Cách implement

Quan gần cạnh business súc tích của người tiêu dùng với cố gắng chia nó thành nhì phần: tính năng chủ công, độc lập với mã khác -> phần này đã là publisher; phần còn sót lại sẽ biến thành tập những class subscriber.Khai báo giao diện subscriber. Tại nấc tối thiểu, nó yêu cầu knhị báo một cách làm update.Knhì báo đồ họa publisher với thể hiện hai thủ tục là thêm đối tượng người dùng subscriber cùng xóa đối tượng kia ngoài list. Hãy nhớ là publisher chỉ được gia công việc cùng với subscriber qua bối cảnh subscriber.Quyết định vị trí đặt danh sách subscribe thực tiễn với việc triển khai các cách làm subscribe. thường thì, code này đã giống như nhau với tất cả các nhiều loại publisher, cho nên vì vậy, địa chỉ rõ ràng để đặt nó là trong một lớp trừu tượng inherit thẳng trường đoản cú bối cảnh publisher. Class publisher cụ thể extover class đó, thừa kế hành động subscribe.Tuy nhiên, nếu khách hàng sẽ vận dụng DPhường này mang đến khối hệ thống class hiện nay có, hãy để mắt tới biện pháp tiếp cận dựa trên composition: đặt logic subscribe vào một đối tượng người dùng hiếm hoi cùng khiến cho toàn bộ những publisher thực áp dụng nó.Tạo những class publisher cụ thể. Mỗi Khi bao gồm điều gì quan trọng đặc biệt xẩy ra bên phía trong publisher, publisher vẫn bắt buộc thông báo mang đến tất cả mọi subscriber của mình.Implement các cách làm thông tin cập nhật trong những lớp subscriber ví dụ. Hầu không còn subscriber vẫn nên một số trong những dữ liệu ngữ chình ảnh về việc khiếu nại. Dữ liệu kia rất có thể được pass vào làm một param của cách làm thông tin.Nhưng tất cả một lựa chọn không giống, đó là lúc nhận thấy thông báo, subscriber rất có thể mang ngẫu nhiên tài liệu như thế nào trực tiếp trường đoản cú thông báo. Trong ngôi trường vừa lòng này, publisher buộc phải trường đoản cú pass thiết yếu nó trải qua qua cách thức update. Tùy lựa chọn kém nhẹm linh hoạt hơn là link đơn vị xuất phiên bản với subscriber lâu dài thông qua phương thức khởi chế tạo.Client phải lập tất cả subscriber quan trọng và subscribe bọn chúng cùng với những publisher tương thích.

Ưu và nhược điểm

Ưu 1: Open/Closed Principle: Quý khách hàng hoàn toàn có thể thêm các class subscriber bắt đầu mà không cần phải biến hóa code của class publisher (cùng ngược trở lại giả dụ tất cả bối cảnh publisher).Ưu 2: quý khách rất có thể tùy chỉnh tình dục thân các đối tượng người tiêu dùng tại runtime.Nhược: Không kiểm soát và điều hành được lắp thêm từ subscriber nhấn thông tin.

Mối quan hệ tình dục cùng với các DPhường khác

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

Sự khác hoàn toàn thân Mediator với Obhệ thống thường xuyên thuôn trong vô số trường đúng theo. Trong phần đông những ngôi trường đúng theo, bạn có thể implement một trong các DP.. này; tuy thế nhiều lúc chúng ta có thể áp dụng bên cạnh đó cả nhì. Hãy coi cách Shop chúng tôi có tác dụng điều đó.

Mục tiêu chủ yếu của Mediator là đào thải sự phụ thuộc vào lẫn nhau giữa một tập phù hợp những thành phần nằm trong khối hệ thống. Thay vào kia, các nhân tố này trở cần phụ thuộc vào vào trong 1 đối tượng trung gian duy nhất. Mục tiêu của ObVPS là thiết lập những kết nối cồn một chiều thân những đối tượng người sử dụng, trong những số ấy một trong những đối tượng người dùng hoạt động như cấp dưới của các đối tượng người sử dụng không giống.

Có một giải pháp thực hiện thịnh hành của Mediator mà lại phụ thuộc vào Obhệ thống. Đối tượng mediator nhập vai trò là publisher cùng những nhân tố nhập vai trò là subscriber subscribe với hủy subscribe những sự khiếu nại của mediator. lúc Mediator được implement theo cách này, nó rất có thể trông khôn xiết giống với ObVPS.

khi chúng ta thấy nặng nề hiểu, hãy hãy nhớ là chúng ta cũng có thể implement Mediator theo những phương pháp khác. Ví dụ: chúng ta cũng có thể links dài lâu tất cả các component với cùng 1 đối tượng người dùng Mediator. Việc xúc tiến này sẽ không giống như với ObVPS nhưng lại vẫn đang là một trong những phiên phiên bản của Mediator.

Bây tiếng hãy tưởng tượng một chương trình cơ mà toàn bộ những component đã trở thành publisher, chất nhận được những kết nối cồn thân nhau. Sẽ không tồn tại đối tượng người dùng mediator triệu tập, chỉ có một tổ obVPS phân tán.