The Command Pattern
Command 패턴은 메서드 호출, 요청 또는 연산을 단일 개체로 캡슐화하고 우리의 재량에 따라 실행될 수있는 메서드 호출을 매개 변수화하고 전달하는 기능을 제공합니다. 또한, 우리는 액션을 호출하는 객체를 구현하는 객체와 분리 할 수 있으므로 구체적인 클래스 (객체)를 교체 할 때 전반적인 유연성이 향상되었습니다.
구체적인 클래스는 클래스 기반 프로그래밍 언어 측면에서 가장 잘 설명되며 추상 클래스의 아이디어와 관련이 있습니다. abstract 클래스는 인터페이스를 정의하지만 모든 멤버 함수에 대한 구현을 제공하지는 않습니다. 이 클래스는 다른 클래스가 파생 된 기본 클래스의 역할을합니다. 누락 된 기능을 구현하는 파생 클래스를 구체적 클래스라고합니다.
커맨드 패턴의 일반적인 개념은 커맨드를 실행하는 것과 커맨드를 발행하는 책임을 분리하고 대신이 책임을 다른 객체에 위임하는 수단을 제공한다는 것입니다.
구현 현명하고 간단한 명령 객체는 동작과 동작을 호출하려는 객체를 함께 바인딩합니다. 그것들은 지속적으로 run()
또는 execute()
같은 실행 연산을 포함합니다. 인터페이스가 동일한 모든 Command 객체는 필요에 따라 쉽게 교체 할 수 있으며 패턴의 큰 이점 중 하나로 간주됩니다.
커맨드 패턴을 보여주기 위해 우리는 간단한 자동차 구매 서비스를 만들 것입니다.
(function(){
var carManager = {
// request information
requestInfo: function( model, id ){
return "The information for " + model + " with ID " + id + " is foobar";
},
// purchase the car
buyVehicle: function( model, id ){
return "You have successfully purchased Item " + id + ", a " + model;
},
// arrange a viewing
arrangeViewing: function( model, id ){
return "You have successfully booked a viewing of " + model + " ( " + id + " ) ";
}
};
})();
위의 코드를 살펴보면 객체에 직접 액세스하여 carManager
메서드를 호출하는 것이 간단합니다. 우리는 이것에 아무 문제가 없다는 것을 모두 용서할 것입니다 - 기술적으로 그것은 완전히 유효한 JavaScript입니다. 그러나 이것이 불리한 시나리오가 있습니다.
예를 들어, carManager
뒤에있는 핵심 API가 변경된 경우를 상상해보십시오. 이렇게하려면 응용 프로그램 내에서 이러한 메서드에 직접 액세스하는 모든 개체도 수정해야합니다. 이것은 가능한 한 객체를 느슨하게 결합하는 OOP 방법에 효과적으로 반대하는 결합 계층으로 볼 수 있습니다. 대신, 우리는 멀리 API를 추상화하여이 문제를 해결할 수 있습니다.
이제는 carManager
를 확장하여 Command 패턴을 적용하면 car 모델 및 ID와 같이 사용할 수있는 모든 데이터를 전달하면서 carManager
객체에서 수행 할 수있는 명명 된 메서드를 수락합니다.
다음은 우리가 달성하고자하는 것입니다.
carManager.execute( "buyVehicle", "Ford Escort", "453543" );
이 구조체에 따라 다음과 같이 carManager.execute
메소드에 대한 정의를 추가해야합니다.
carManager.execute = function ( name ) {
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
};
따라서 최종 샘플 호출은 다음과 같이 보입니다.
carManager.execute( "arrangeViewing", "Ferrari", "14523" );
carManager.execute( "requestInfo", "Ford Mondeo", "54323" );
carManager.execute( "requestInfo", "Ford Escort", "34232" );
carManager.execute( "buyVehicle", "Ford Escort", "34232" );