본문으로 건너뛰기

중재자 패턴_JavaScript 디자인 패턴 5

무료2015-07-18#JS#Design_Pattern#中介者模式#Mediator_Pattern#JavsScript中介者模式

중재자 패턴은 발행/구독 패턴과 매우 유사하며, 발행/구독 패턴의 더욱 강화된 형태 (계층 구조) 라고 할 수 있지만, 동시에 일부 제한도 추가되었습니다 (중재자를 통한 상호작용 필요). 본고에서는 JavaScript 로 구현된 중재자 패턴을 자세히 소개합니다

일.중재자 패턴

중재자, 즉 제 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 참조

삼.중재자 패턴과 발행/구독 패턴

(물론, 발행/구독 패턴은 관찰자 패턴에서 유래했으며, 중재자 패턴은 손자 세대라고 할 수 있습니다.)

구현에서 보면, 중재자 패턴과 발행/구독 패턴은 매우 유사하며, 자세히 보지 않으면 차이를 발견할 수 없을 정도입니다. 주요 차이점은 다음과 같습니다:

  1. 통신 방식

중재자 패턴에서는 각 모듈이 메시지를 발행할 수 있으며 (중재자 자신도 메시지 발행 가능), 발행/구독 패턴에서는 관찰자는 수동적으로 메시지를 기다릴 뿐입니다

  1. 모듈 의존 구조

중재자 패턴은 성상 구조로, 중재자는 하나의*"제어점"이며, 발행/구독 패턴에서는 발행구독 메커니즘 자체는 하나의"제어층"*으로, 상위 층은 제어층을 통해 하위 층 모듈을 조작할 수 있음을 의미합니다 (상위 층은 중재자를 통해 하위 층 모듈을 제어할 수도 있지만, 이는 성상 구조의 본의는 아닙니다)

  1. 정보 발행 방식

다대다에서 다대일로 바뀌어, 모든 모듈은 중재자와 직접 대화할 뿐입니다

단점:

  1. 단일 장애점

이는 중재자 패턴의 가장 큰 단점으로, 발행/구독 패턴에도 이 단점이 존재하지만, 중재자 패턴에서는 더욱 예리하게 나타납니다 ("제어점"과 "제어층"을 결합하여 이해)

  1. 성능 저하

모듈 간은 제 3 자를 통해서만 상호작용할 수 있어, 직접 상호작용에 비해 확실히 성능 저하가 존재하며, 이는 디자인 패턴이 공유하는 부작용입니다

  1. 로직 구현 난이도 증가

느슨한 결합으로 인해 시스템 제어가 어려워지고, 브로드캐스트만 주목하는 것만으로 시스템이 어떻게 반응하는지 확정하기 어려워, 완전한 로직을 각 Topic 에 분할해야 하여, 구현상의 복잡도가 증가합니다

참고 자료

  • 《JavaScript 디자인 패턴》

댓글

아직 댓글이 없습니다

댓글 작성