예를 들어 보겠습니다. 두 개의 애플리케이션을 빌드한다고 가정합니다.
- 채팅 응용 프로그램입니다.
- 응급 구급차 운영자 응용 프로그램입니다.
중재인
채팅 애플리케이션을 구축하면 mediator
디자인 패턴을 선택하게됩니다 .
- 사람들은 주어진 시간에 채팅에 참여하고 나갈 수 있으므로 두 사람이 채팅을 직접 참조하는 것은 의미가 없습니다.
- 우리는 여전히 두 사람 사이의 의사 소통을 용이하게하고 그들이 채팅을 할 수 있도록해야합니다.
우리가 선호하는 이유는 무엇 mediator
입니까? 그 정의를 살펴보십시오.
중재자 패턴을 사용하면 개체 간의 통신이 중재자 개체 내에 캡슐화됩니다. 객체는 더 이상 서로 직접 통신하지 않고 대신 중재자를 통해 통신합니다. 이렇게하면 통신 개체 간의 종속성이 줄어들어 결합이 줄어 듭니다.
마법은 어떻게 작동합니까? 먼저 채팅 중개자를 생성하고 개인 객체를 등록하여 모든 개인과 양방향 연결을 갖도록 할 것입니다 (사용자는 채팅 중개자를 사용하여 메시지를 보낼 수 있으므로 액세스 할 수 있고 채팅 중개자는 액세스 할 수 있습니다. 사람 객체의 수신 된 메소드로 인해 액세스 권한도 있습니다.)
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);
관찰자
911 통화 애플리케이션을 구축하면 observer
디자인 패턴을 선택하게됩니다 .
- 각 구급차
observer
개체는 긴급 상황이있을 때 알림을 받기를 원하므로 주소를 운전하고 도움을 줄 수 있습니다.
- 비상 운영자
observable
는 구급차의 각 정보를 계속 참조하고 observers
도움이 필요할 때 (또는 이벤트 생성) 알립니다.
우리가 선호하는 이유는 무엇 observer
입니까? 그 정의를 살펴보십시오.
주체라고하는 객체는 관찰자라고하는 종속 목록을 유지하고 일반적으로 메서드 중 하나를 호출하여 상태 변경을 자동으로 알립니다.
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);
차이점들:
- 채팅
mediator
은 사람 개체 (송신 및 수신)간에 양방향 통신 observable
이 가능 하며 운영자 는 단방향 통신 만 가능합니다 (구급차 observer
에게 운전하고 종료하도록 지시).
- 채팅
mediator
은 사람 개체가 그들 사이에서 상호 작용하도록 할 수 있으며 (직접 통신이 아니더라도) 구급차 observers
는 운영자 observable
이벤트 에만 등록 합니다.
- 각 사람 개체는 채팅에 대한 참조를 가지고
mediator
, 또한 채팅 mediator
위격의 모든 하나 킵 참조. 구급차 observer
가 운영자를 참조하지 않는 observable
경우, 운영자 만이 observable
모든 구급차를 참조합니다 observer
.
Programmers.StackExchange
로 마이그레이션하라는 요청 은 거부되었지만 답변에 관심이 있었기 때문에 비슷한 게시물을 작성했습니다 . 흥미로운 답변을 찾을 수 있습니다. :)