소개하다
명령 모드는 다음과 같이 정의됩니다. 요청을 객체로 캡슐화하는 데 사용하여 다른 요청으로 클라이언트를 매개 변수화 할 수 있습니다. 대기열 또는 로그 요청 및 취소 가능한 작업을 수행하십시오. 다시 말해, 변경 모드는 함수를 단일 객체로 호출, 요청 및 작동하도록 설계 한 다음 객체에서 일련의 처리를 수행하도록 설계되었습니다. 또한 특정 함수를 구현하는 객체를 호출하여 명령 개체 및 수신 객체를 분리 할 수 있습니다.
텍스트
차량 구매 프로그램을 통해이 패턴을 보여 주어서 먼저 차량 구매의 특정 운영 클래스를 정의합니다.
코드 사본은 다음과 같습니다.
$ (function () {
var carmanager = {
// 정보 요청
requestInfo : function (model, id) {
' + model +의 정보를 반환합니다
'ID'with ' + id +'는 foobar '입니다.
},
// 차를 사십시오
Buyvehicle : 함수 (모델, id) {
반품 '당신은 아이템을 성공적으로 구입했습니다'
+ id + ',' + 모델;
},
//보기 정리
배열 뷰 : 함수 (model, id) {
반품 '당신은 성공적으로 예약했습니다.
+ model + '(' + id + ')';
}
};
}) ();
위의 코드를 살펴 보겠습니다. 우리는 단순히 함수를 호출하여 관리자 명령을 실행합니다. 그러나 경우에 따라 객체 내부에서 메소드를 직접 호출하고 싶지 않습니다. 이것은 물체 간의 의존성을 증가시킵니다. 이제이 Carmanager를 확장하여 모델 및 자동차 ID를 포함한 Carmanager 객체의 처리 요청을 수락합시다. 명령 패턴의 정의에 따르면 다음 기능 호출을 구현하기를 희망합니다.
코드 사본은 다음과 같습니다.
carmanager.execute ({CommandType : "BuyveHicle", Operand1 : 'Ford Escort', Operand2 : '453543'});
이 요구 사항에 따라 Carmanager.EceCute 메소드를 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
carmanager.execute = function (명령) {
return carmanager [command.request] (command.model, command.carid);
};
전환 후 통화가 훨씬 간단하고 다음 통화를 구현할 수 있습니다 (물론 일부 예외 세부 사항은 여전히 개선되어야합니다).
코드 사본은 다음과 같습니다.
carmanager.execute ({request : "jatrangeviewing", model : 'ferrari', carid : '145523'});
carmanager.execute ({request : "requestInfo", 모델 : 'Ford Mondeo', Carid : '543434'});
carmanager.execute ({request : "requestinfo", 모델 : '포드 에스코트', 카리드 : '543434'});
carmanager.execute ({request : "buyvehicle", model : 'Ford Escort', Carid : '543434'});
요약
명령 모드는 명령 큐를 디자인하기가 더 쉽고 필요할 때 명령을 로그에 계산하기가 더 쉽고 요청을 수락하는 당사자가 호출 여부를 결정하고 요청의 취소 및 재설정을 구현할 수 있습니다. 또한 추가 된 특정 클래스는 다른 클래스에 영향을 미치지 않기 때문에 구현하기 쉽습니다.
그러나 민첩한 개발의 원칙은 우리에게 코드에 추측 기반과 원치 않는 기능을 추가하지 말라고 말합니다. 시스템에 명령 모드가 필요한지 확실하지 않은 경우 일반적으로 구현하기 위해 서두르지 않아야합니다. 실제로이 모드가 필요할 때 구현하는 것은 어렵지 않습니다. 실행 취소, 복원 작업 및 기타 기능과 같이 진정으로 필요할 때 원래 코드를 명령 모드로 리팩터링하는 것은 의미가 있습니다.