커맨드 패턴(Command pattern)이란 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴이다.
어떠한 행동에 대한 정의 들을 제어 할때 사용하면 좋다 .
- 명령(command), 수신자(receiver), 발동자(invoker), 클라이언트(client)의 네개의 용어가 항상 따른다.
- 요청과 수행을 분리시켜 느슨한 결합을 유지한다.
- 일련의 행동을 특정 Receiver하고 연결을 통해 캡슐화하고 execute()라는 메소드 하나만 외부에 공개한다.
장점
- 요청부분과 요청실행부분을 분리(낮은 결합도, 독립적 변경 가능)
- 실행취소, 보관, 로그 생성 가능
* 전략패턴(strategy pattern)과 비슷하지만 커맨드 패턴은 전달받은 객체가 하는 일에 대해 정확히 알지 못한다.
- wiki 참조 -
// 자바스크립트로 구현
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<script>
// 커맨드 패턴
// 리모컨 만들기
// 1. 리시버에서 해당 기능 구현
// 2. command 에 interface 생성
// 3. command에 recevier에서 받은 객체를 실행하는 동작에 대해 execute에 정의
// 4. invoker 에서 setcommand 명령에 대해 저장하는 처리
// 5. invoker에 목적에 맞는 custom메서드를 생성 (ex> 리모컨켜기, 리모컨 끄기 등)
function r(msg){
return function(){
document.body.innerHTML += (msg+"<br />");
}
}
var client, recevier, invoker, command;
function Light(){} //recevier
Light.prototype = {
"on" : r("on"),
"off" : r("off")
};
//(new Light).on();
function lightOnCommand(receiver_obj){ //command
this.execute = function(){
receiver_obj.on();
};
this.undo = function(){
receiver_obj.off();
};
}
function lightOffCommand(receiver_obj){ //command
this.execute = function(){
receiver_obj.off();
};
this.undo = function(){
receiver_obj.on();
};
}
function RemoteControl(){ //invoker
this.setCommand = function(cmd){
this.obj = cmd;
}
this.press = function(){
this.obj.execute();
this.undocommand = this.obj;
}
this.undo = function(){
this.undocommand.undo();
}
}
client = function(){
var light = new Light;
var lightOn = new lightOnCommand(light);
var lightOff = new lightOffCommand(light);
var remoteControl = new RemoteControl;
remoteControl.setCommand(lightOn);
remoteControl.press();
remoteControl.undo();
remoteControl.setCommand(lightOff);
remoteControl.press();
remoteControl.undo();
}();
</script>
</body>
</html>
댓글 없음:
댓글 쓰기