Người hòa giải vs Người quan sát?


27

Ai đó có thể cung cấp cho tôi một câu trả lời chính tắc về sự khác biệt giữa một Observervà một Mediator, và một bản tóm tắt về thời điểm bạn nên sử dụng một mẫu trên mẫu kia không?

Tôi không chắc loại tình huống nào sẽ yêu cầu Observervà loại nào sẽ yêu cầuMediator


Tôi muốn biết ý tưởng của riêng bạn về điều này sau 7 năm?
Niing

Câu trả lời:


19

Trong cuốn sách gốc đưa ra các thuật ngữ Người quan sát và Người hòa giải, Mẫu thiết kế, Các yếu tố của Phần mềm hướng đối tượng có thể tái sử dụng, nó nói rằng mẫu Người hòa giải có thể được thực hiện bằng cách sử dụng mẫu Người quan sát. Tuy nhiên, điều này cũng có thể được thực hiện bằng cách có các Đồng nghiệp (gần tương đương với mẫu Đối tượng của Người quan sát) có tham chiếu đến lớp Người hòa giải hoặc giao diện Người hòa giải.

Có nhiều trường hợp khi bạn muốn sử dụng mẫu quan sát viên, điều quan trọng là trên đối tượng không nên biết những gì các đối tượng khác đang quan sát trạng thái của nó.

Hòa giải viên cụ thể hơn một chút, nó tránh việc các lớp giao tiếp trực tiếp mà thay vào đó thông qua một hòa giải viên. Điều này giúp nguyên tắc Trách nhiệm duy nhất bằng cách cho phép truyền thông được giảm tải đến một lớp chỉ xử lý việc đó.

Một ví dụ về Người hòa giải cổ điển nằm trong GUI, trong đó cách tiếp cận ngây thơ có thể dẫn đến mã trên sự kiện nhấp vào nút nói rằng "nếu bảng Foo bị vô hiệu hóa và bảng điều khiển Bar có nhãn" Vui lòng nhập ngày "thì đừng gọi máy chủ, nếu không thì hãy tiếp tục ", với mẫu Người hòa giải có thể nói" Tôi chỉ là một nút và không có doanh nghiệp trần gian nào biết về bảng điều khiển Foo và nhãn trên bảng Thanh, vì vậy tôi sẽ chỉ hỏi người hòa giải nếu gọi máy chủ là ổn ngay bây giờ. "

Hoặc, nếu nó được triển khai bằng cách sử dụng mẫu quan sát viên, nút sẽ nói "Này, người quan sát (bao gồm cả người hòa giải), trạng thái của tôi đã thay đổi (ai đó đã nhấp vào tôi). Hãy làm gì đó nếu bạn quan tâm". Trong ví dụ của tôi có lẽ ít ý nghĩa hơn, nhưng đôi khi nó sẽ như vậy, và sự khác biệt giữa Người quan sát và Người hòa giải sẽ là một ý định hơn là sự khác biệt trong chính mã.


Cảm ơn bạn, ví dụ của bạn thực sự đã giúp làm rõ sự khác biệt giữa hai cho tôi. Nếu tôi hiểu đúng về bạn, mẫu người quan sát sử dụng hệ thống đăng ký / phát tin nhắn để liên lạc, trong khi người hòa giải giống như một thực thể có thể truy cập toàn cầu mà các đối tượng có thể truy vấn thông tin.
Rachel

@Rachel - Tôi sẽ mô tả người quan sát như bạn đã làm. Hòa giải viên có thể không phải là toàn cầu, nhưng được biết đến với tất cả các đối tượng trong tập hợp có thể đã liên lạc với nhau nhưng bây giờ đi qua hòa giải viên. Trừ khi hòa giải viên được triển khai như một người quan sát, trong trường hợp đó, nó biết về tất cả các đối tượng đó (ít nhất là thông qua giao diện quan sát được của họ, có thể trực tiếp) nhưng họ không biết về nó.
psr

9

Mẫu Observer hoạt động tốt khi không cần sự phối hợp giữa các quan sát viên và mối quan hệ quan sát đi theo một chiều.

Ví dụ, để các đối tượng B và C quan sát đối tượng A. Khi đối tượng A kích hoạt sự kiện X, thì đối tượng B sẽ thực thi phương thức Y () và đối tượng C sẽ thực thi phương thức Z (). Nếu các phương thức BY () và CZ () hoàn toàn độc lập và không cần phối hợp, thì hãy tiếp tục và sử dụng mẫu quan sát viên.

Mặt khác, nếu BY () phải được thực thi trước CZ () thì bạn sẽ muốn sử dụng mẫu Người hòa giải trong đó người hòa giải đóng gói sự phối hợp này. Trong trường hợp này, hòa giải viên M sẽ quan sát đối tượng A và sẽ có các tham chiếu đến các đối tượng B và C. Khi A phát sinh sự kiện X, M sẽ xử lý sự kiện đó và gọi BY () và CZ () theo thứ tự quy định.

Ngoài ra, nếu các đối tượng A, B và C cần quan sát lẫn nhau thì sử dụng một trung gian hòa giải làm trung gian sẽ đi một chặng đường dài để tách rời các đối tượng này và tránh mã spaghetti.


5

Các Observermô hình được sử dụng khi một hành động được thực hiện trên một lớp (lớp quan sát) cần phải tạo ra một phản ứng trong lớp khác (lớp quan sát) nhưng nó là không mong muốn cho lớp quan sát được kết hợp với lớp quan sát. Đây là một mô hình rất phổ biến. Trình phân tích cú pháp XML SAX có thể là một ví dụ tốt. Để sử dụng trình phân tích cú pháp SAX, một máy khách thực hiện ContentHandlergiao diện để "quan sát" hoạt động của trình phân tích cú pháp. Khi trình phân tích cú pháp bắt gặp các phần tử của tài liệu XML, nó gọi các phương thức của ContentHandler. Trình phân tích cú pháp có thể gọi mã máy khách, nhưng trình phân tích cú pháp không được kết hợp với mã máy khách.

Các Mediatormô hình là một đóng gói của một mô hình của việc sử dụng một tập hợp các đối tượng. Mã khách hàng chỉ được ghép với bộ trung gian, thay vì được ghép với nhiều lớp khác. Nó tương tự như tập hợp, ngoại trừ thời gian tồn tại của các đối tượng được đóng gói độc lập với thời gian tồn tại của hòa giải viên.


1

Nói một cách đơn giản (mà tôi sử dụng để ghi nhớ nó):

Người quan sát: Sử dụng khi một đối tượng muốn được thông báo về những thay đổi trạng thái ở người khác (nói đúng ra, sử dụng các sự kiện là Người quan sát)

Để hiểu về hòa giải, tôi thấy dễ dàng hơn khi bạn xem xét Mặt tiền trước: Mặt tiền tổng hợp chức năng của các lớp riêng biệt (đôi khi toàn bộ hệ thống con) và cung cấp chức năng đó trong một giao diện duy nhất.

Người hòa giải: Giống như Mặt tiền, ngoại trừ việc nó kết hợp chức năng của tất cả các lớp tổng hợp để tạo ra chức năng mới . (Giải thích tốt ở đây )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.