Hãy đi qua một ví dụ: xem xét bạn muốn xây dựng hai ứng dụng:
- Ứng dụng trò chuyện.
- Ứng dụng điều hành xe cấp cứu khẩn cấp.
người hòa giải
Xây dựng ứng dụng trò chuyện, bạn sẽ chọn mediator
mẫu thiết kế.
- Mọi người có thể tham gia và rời khỏi cuộc trò chuyện vào bất kỳ thời điểm nào, vì vậy không có ý nghĩa gì khi giữ thông tin tham khảo trực tiếp giữa hai người đang trò chuyện.
- Chúng tôi vẫn cần tạo điều kiện giao tiếp giữa hai người và cho phép họ trò chuyện.
Tại sao chúng tôi sẽ thích mediator
? chỉ cần xem qua định nghĩa của nó:
Với mẫu trung gian, giao tiếp giữa các đối tượng được gói gọn trong một đối tượng trung gian. Các đối tượng không còn giao tiếp trực tiếp với nhau mà thay vào đó là giao tiếp thông qua trung gian. Điều này làm giảm sự phụ thuộc giữa các đối tượng giao tiếp, do đó giảm sự ghép nối.
Phép thuật hoạt động như thế nào? Trước tiên, chúng tôi sẽ tạo hòa giải trò chuyện và làm cho các đối tượng cá nhân đăng ký với nó, vì vậy nó sẽ có kết nối hai hướng với mọi người (người đó có thể gửi tin nhắn bằng cách sử dụng hòa giải trò chuyện khiến nó truy cập vào nó và người hòa giải trò chuyện sẽ truy cập phương thức đã nhận của đối tượng person vì anh ta cũng có quyền truy cập vào nó)
function Person(name) {
let self = this;
this._name = name;
this._chat = null;
this._receive(from, message) {
console.log("{0}: '{1}'".format(from.name(), message));
}
this._send(to, message) {
this._chat.message(this, to, message);
}
return {
receive: (from, message) => { self._receive(from, message) },
send: (to, message) => { self._send(to, message) },
initChat: (chat) => { this._chat = chat; },
name: () => { return this._name; }
}
}
function ChatMediator() {
let self = this;
this._persons = [];
return {
message: function (from, to, message) {
if (self._persons.indexOf(to) > -1) {
self._persons[to].receive(from, message);
}
},
register: function (person) {
person.initChat(self);
self._persons.push(person);
}
unRegister: function (person) {
person.initChat(null);
delete self._persons[person.name()];
}
}
};
//Usage:
let chat = new ChatMediator();
let colton = new Person('Colton');
let ronan = new Person('Ronan');
chat.register(colton);
chat.register(ronan);
colton.send(colton, 'Hello there, nice to meet you');
ronan.send(ronan, 'Nice to meet you to');
colton.send(colton, 'Goodbye!');
chat.unRegister(colton);
người quan sát
Xây dựng ứng dụng cuộc gọi 911, bạn sẽ chọn observer
mẫu thiết kế.
- Mỗi
observer
đối tượng cứu thương đều mong muốn được thông báo khi có tình trạng khẩn cấp, để lái xe biết địa chỉ và đưa ra yêu cầu giúp đỡ.
- Người điều hành cấp cứu
observable
giữ thông tin liên quan đến từng người trên xe cứu thương observers
và thông báo cho họ khi cần trợ giúp (hoặc phát sinh sự kiện).
Tại sao chúng tôi sẽ thích observer
? chỉ cần xem qua định nghĩa của nó:
Một đối tượng, được gọi là chủ thể, duy trì một danh sách các phần tử phụ thuộc của nó, được gọi là các quan sát viên và tự động thông báo cho chúng về bất kỳ thay đổi trạng thái nào, thường bằng cách gọi một trong các phương thức của chúng.
function AmbulanceObserver(name) {
let self = this;
this._name = name;
this._send(address) {
console.log(this._name + ' has been sent to the address: ' + address);
}
return {
send: (address) => { self._send(address) },
name: () => { return this._name; }
}
}
function OperatorObservable() {
let self = this;
this._ambulances = [];
return {
send: function (ambulance, address) {
if (self._ambulances.indexOf(ambulance) > -1) {
self._ambulances[ambulance].send(address);
}
},
register: function (ambulance) {
self._ambulances.push(ambulance);
}
unRegister: function (ambulance) {
delete self._ambulances[ambulance.name()];
}
}
};
//Usage:
let operator = new OperatorObservable();
let amb111 = new AmbulanceObserver('111');
let amb112 = new AmbulanceObserver('112');
operator.register(amb111);
operator.register(amb112);
operator.send(amb111, '27010 La Sierra Lane Austin, MN 000');
operator.unRegister(amb111);
operator.send(amb112, '97011 La Sierra Lane Austin, BN 111');
operator.unRegister(amb112);
Sự khác biệt:
- Trò chuyện
mediator
có hai cách giao tiếp giữa các đối tượng người (gửi và nhận) trong khi người điều hành observable
chỉ có một cách giao tiếp (Nó yêu cầu xe cấp cứu observer
lái xe và kết thúc).
- Trò chuyện
mediator
có thể làm cho các đối tượng người tương tác giữa họ (ngay cả khi đó không phải là giao tiếp trực tiếp), xe cứu thương observers
chỉ đăng ký các observable
sự kiện của người điều hành .
- Mỗi đối tượng người có một tham chiếu đến cuộc trò chuyện
mediator
, và trò chuyện cũng mediator
giữ tham chiếu đến mỗi người trong số những người đó. Bánh xe cứu thương observer
không giữ tham chiếu cho người điều hành observable
, chỉ người điều hành observable
giữ tham chiếu đến mọi xe cứu thương observer
.
Programmers.StackExchange
đã bị từ chối, nhưng tôi đã thực hiện một bài đăng tương tự ở đó vì tôi quan tâm đến câu trả lời. Bạn có thể thấy một số câu trả lời thú vị. :)