일.중재자 패턴
중재자, 즉 제 3 자로, 원래는 양측이 직접 상호작용하던 것을, 중재자를 도입한 후 모든 상호작용은 제 3 자를 통해 완료해야 합니다
예를 들어, 원래는 무전기로 직접 통신하던 것이, 지금은 이메일로 바뀌어 이메일 서버가 전달을 담당합니다. 모듈 상호작용에 대응하면 원래의 망상 구조가 지금은 성상 구조로 바뀌어, 각 모듈 간의 의존이 감소되고, 중심점 (중재자) 에 통일하��� 의존하며, 동시에 중심점도 이로 인해 더 많은 제어 권한을 획득했습니다. 예를 들어, 일제 송신, 버블 알림 등이 가능합니다
모든 모듈 간의 상호작용은 중재자를 통해 수행해야 하며, 모듈은 서로 잘 알지 못합니다. 메시지를 중재자에게 발행하기만 하면, 중재자는 자연스럽게 인지 필요 (해당 주제를 구독한) 한 사람에게 알림합니다. 시스템은 이러한 메커니즘으로 작동하며, 중재자가 제어 핵심입니다
이.중재자 패턴의 구체적 구현
###1. 가장 간단한 중재자 패턴
var mediator = (function() {
var topics = {},
subUid = -1;
var publish = function(topic, args) {
if (!topics[topic]) {
return false;
}
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func(topic, args);
}
return true;
};
var subscribe = function(topic, func) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = (++subUid).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
return {
publish: publish,
subscribe: subscribe,
// 好像确实没有比 installTo 更合适的名字
installTo: function(obj) {
obj.publish = publish;
obj.subscribe = subscribe;
}
}
}());
// 具体应用
var mod1 = {
run: function(arg) {
console.log('mod1 received ' + arg);
}
};
var mod2 = {};
var topic = 'myTopic';
mediator.installTo(mod1);
mediator.installTo(mod2);
// mod1 订阅消息
mod1.subscribe(topic, function(t, arg) {
mod1.run(arg);
});
// mod2 发布消息
mod2.publish(topic, 'data');
언뜻 보면 앞에서 소개한 [발행/구독 패턴] 과 큰 차이가 없습니다. 예시에 나타나는 한 가지 차이는 어떤 모듈도 메시지를 발행할 수 있다는 것이며, 발행/구독 패턴에서는 관찰자는 수동적으로 메시지를 수신할 뿐입니다. 구체적인 차이는 아래에서 자세히 전개하여 소개합니다
###2. 기능이 강력한 중재자 패턴
http://thejacklawson.com/Mediator.js/index.html 은 기능이 강력한 구현을 제공하며, topic 네임스페이스, 메시지 버블, 우선순위 등을 지원합니다
소스 코드 (주석 포함) 는http://thejacklawson.com/Mediator.js/mediator.html 또는 github 참조
삼.중재자 패턴과 발행/구독 패턴
(물론, 발행/구독 패턴은 관찰자 패턴에서 유래했으며, 중재자 패턴은 손자 세대라고 할 수 있습니다.)
구현에서 보면, 중재자 패턴과 발행/구독 패턴은 매우 유사하며, 자세히 보지 않으면 차이를 발견할 수 없을 정도입니다. 주요 차이점은 다음과 같습니다:
- 통신 방식
중재자 패턴에서는 각 모듈이 메시지를 발행할 수 있으며 (중재자 자신도 메시지 발행 가능), 발행/구독 패턴에서는 관찰자는 수동적으로 메시지를 기다릴 뿐입니다
- 모듈 의존 구조
중재자 패턴은 성상 구조로, 중재자는 하나의*"제어점"이며, 발행/구독 패턴에서는 발행구독 메커니즘 자체는 하나의"제어층"*으로, 상위 층은 제어층을 통해 하위 층 모듈을 조작할 수 있음을 의미합니다 (상위 층은 중재자를 통해 하위 층 모듈을 제어할 수도 있지만, 이는 성상 구조의 본의는 아닙니다)
- 정보 발행 방식
다대다에서 다대일로 바뀌어, 모든 모듈은 중재자와 직접 대화할 뿐입니다
단점:
- 단일 장애점
이는 중재자 패턴의 가장 큰 단점으로, 발행/구독 패턴에도 이 단점이 존재하지만, 중재자 패턴에서는 더욱 예리하게 나타납니다 ("제어점"과 "제어층"을 결합하여 이해)
- 성능 저하
모듈 간은 제 3 자를 통해서만 상호작용할 수 있어, 직접 상호작용에 비해 확실히 성능 저하가 존재하며, 이는 디자인 패턴이 공유하는 부작용입니다
- 로직 구현 난이도 증가
느슨한 결합으로 인해 시스템 제어가 어려워지고, 브로드캐스트만 주목하는 것만으로 시스템이 어떻게 반응하는지 확정하기 어려워, 완전한 로직을 각 Topic 에 분할해야 하여, 구현상의 복잡도가 증가합니다
참고 자료
- 《JavaScript 디자인 패턴》
아직 댓글이 없습니다