一。커맨드 패턴
커맨드 패턴은 메서드 호출 세부사항을 캡슐화하여 요청자와 실행자를 디커플링합니다
([黯羽轻扬:디자인 패턴 之 커맨드 패턴 (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 디자인 패턴》
아직 댓글이 없습니다