본문으로 건너뛰기

커맨드 패턴_JavaScript 디자인 패턴 7

무료2015-07-24#JS#Design_Pattern#JavaScript命令模式

클래식한 커맨드 패턴의 구현에는 요청자, 커맨드, 실행자가 필요하며 매우 크게 보입니다. 이는 주로 강제 타입 체크로 인한 불편함 (추상 타입에 의존하여 인터페이스의 통일을 보증해야 함) 때문입니다. JS 는 약타입이므로 커맨드 패턴 구현이 쉽습니다. 본고에서는 JavaScript 로 구현하는 커맨드 패턴을 자세히 소개합니다

一。커맨드 패턴

커맨드 패턴은 메서드 호출 세부사항을 캡슐화하여 요청자와 실행자를 디커플링합니다

([黯羽轻扬:디자인 패턴 之 커맨드 패턴 (Command Pattern)](/articles/디자인 패턴 之 커맨드 패턴 (command-pattern)/) 에서 인용)

이것이 커맨드 패턴의 핵심입니다. 호출자와 실행자 사이에 커맨드 레이어를 삽입하면, 이전의 호출자는 요청자가 됩니다. 실행자를 직접 호출하는 것이 아니라 시스템에 커맨드 요청을 발행합니다. 이때 시스템은 호출자가 되어 커맨드 스케줄링을 담당합니다 (실행자에게 직접 전송하거나 제어를 가하여 일정 조건을 만족할 때 전송). 실행자는 여전히 실행자이지만, 이전 호출자와의 결합 관계가 해제되었을 뿐입니다

二。클래식한 구현 방법

Java 구현은 [黯羽轻扬:디자인 패턴 之 커맨드 패턴 (Command Pattern)](/articles/디자인 패턴 之 커맨드 패턴 (command-pattern)/) 참조

문중의 예는 매우 적절하여 자세히 설명할 필요가 없습니다

三。JavaScript 로 커맨드 패턴 구현

JavaScript 구현은 실제로는 간소화된 버전으로, 기능은 상대적으로 약하지만 구현은 매우 간단합니다. 샘플 코드는 다음과 같습니다:

var module = {
    // 커맨드 (통일 진입구)
    exec: function(cmd) {
        /**
         * Array.prototype.slice.call(arguments, 1) 은一个小技巧
         * 用来把 arguments 对象转换为数组并切掉第一个参数(此处是 cmd 的值)
         */
        return this[cmd] && this[cmd].apply(this, Array.prototype.slice.call(arguments, 1));
    },
    // 공개 인터페이스 1
    sum: function(a, b) {
        return a + b;
    }
    // 공개 인터페이스 2...
}
var sum = module.exec('sum', 1, 2);
console.log(sum);   // 3

이러한 구현은 매우 간결합니다 (우리의 커맨드 패턴은 단 한 줄의 코드). 클래식 구현에서 타입을 제약하기 위해 사용되는 불필요한 추상을 모방할 필요가 없습니다

四。커맨드 패턴과 퍼사드 패턴

잘 생각해보면, 이것은 퍼사드 패턴과 같지 않습니까? 둘 다 기존 인터페이스를 캡슐화합니다. 확실히 매우 유사하지만, 유일한 차이점은 커맨드 패턴은 통일 진입구 제공 (제어 추가) 에 중점을 두는 반면, 퍼사드 패턴은 인터페이스를 더 사용하기 쉽게 만들기 위해 기존 인터페이스를 이차 캡슐화하는 것입니다 (반드시 통일된 하나의 진입구를 제공할 필요는 없으며, 한 세트의 새로운 인터페이스를 제공하는 것도 완전히 가능합니다)

이렇게 이해할 수 있습니다. 퍼사드가 제공하는 인터페이스가 하나뿐일 경우, 이때가 바로 커맨드 패턴입니다. 기존 인터페이스를 캡슐화한 후 제공하는 새로운 인터페이스의 수가 둘을 구분하는 핵심입니다. 커맨드 패턴은 하나만 가질 수 있으며 (예제의 exec), 퍼사드 패턴에는 제한이 없고 새로운 인터페이스가 원래 인터페이스보다 사용하기만 하면 됩니다

참고 자료

  • 《JavaScript 디자인 패턴》

댓글

아직 댓글이 없습니다

댓글 작성