디자인 모드 (13) 명령 모드 Command (대상 행동 형)

7420 단어 디자인 모드
디자인 모드 (13) 명령 모드 Command (대상 행동 형)
1. 개술
        소프트웨어 디자인 에서 우 리 는 항상 특정한 대상 에 게 요청 을 보 내야 하지만 요청 한 수신 자가 누구 인지 모 르 고 요청 한 조작 이 무엇 인지 모 릅 니 다. 우 리 는 프로그램 이 실 행 될 때 구체 적 인 요청 수신 자 를 지정 하면 됩 니 다. 이때 명령 모드 로 디자인 하여 요청 발송 자 와 요청 수신 자가 서로 간 의 결합 을 없 앨 수 있 습 니 다.대상 간 의 호출 관 계 를 더욱 원활 하 게 하 다.
 예 1: 텔레비전 리모컨: 리모컨 은 요청 한 발송 자 이 고 텔레비전 은 요청 한 수신 자 이다. 리모컨 에 켜 기, 끄 기, 채널 바 꾸 기 등 버튼 이 있 으 면 구체 적 인 명령 이 고 서로 다른 버튼 은 텔레비전의 서로 다른 조작 에 대응한다.
2. 문제
      소프트웨어 시스템 에서 '행위 요구 자' 와 '행위 실현 자' 는 보통 '긴밀 한 결합' 을 보인다.그러나 어떤 경우 에 예 를 들 어 행위 에 대해 '기록, 취소 / 재 작업, 사무' 등 처 리 를 해 야 하 는데 이런 변 화 를 막 을 수 없 는 긴밀 한 결합 은 적합 하지 않다.이런 상황 에서 어떻게 '행위 요구 자' 와 '행위 실현 자' 를 결합 시 킵 니까?
3. 해결 방안
 명령 모드 (command Pattern): 요청 을 대상 으로 봉 하여 서로 다른 요청 으로 고객 을 매개 변수 화 할 수 있 도록 합 니 다.요청 대기 열 이나 요청 로 그 를 기록 하고 취소 가능 한 동작 을 지원 합 니 다.명령 모드 는 동작 (Action) 모드 나 트 랜 잭 션 (Transaction) 모드 라 고도 부른다.(Command Pattern: Encapsulate a request asan object, thereby letting youparameterize clients withdifferent requests,queueor log requests,andsupportundoable operations. )
4. 적용 성
1) 시스템 은 호출 자 와 요청 수신 자 를 결합 시 켜 호출 자 와 수신 자가 직접적 으로 상호작용 하지 않도록 해 야 한다.
2) 시스템 은 서로 다른 시간 에 요청 을 지정 하고 줄 을 서서 요청 을 수행 해 야 합 니 다.
3) 시스템 은 명령 의 취소 (Undo) 작업 과 복구 (Redo) 작업 을 지원 해 야 합 니 다.
4) 시스템 은 매크로 명령 을 지원 하 는 일련의 조작 을 조합 해 야 한다.
5. 구조
6. 패턴 구성
추상 명령 클래스 (command):
실행 중인 인 터 페 이 스 를 설명 합 니 다.수신 자 에 게 해당 하 는 조작 을 호출 하여 실행 하 는 방법 Execute 를 실현 합 니 다.
구체 적 인 명령 클래스 (Concretecond):
구체 적 인 명령 대상 을 만 들 고 수신 자 를 설정 합 니 다.보통 수신 자 를 가지 고 수신 자의 기능 을 호출 하여 명령 이 실 행 될 동작 을 수행 합 니 다. 
호출 자 (Invoker):
이 명령 을 실행 하도록 요구 하 다.보통 명령 대상 을 가지 고 있 으 며 명령 대상 을 많이 가 질 수 있다.
수신 자 (Receiver):
요청 과 관련 된 작업 을 수행 하 는 방법 을 알 고 있 습 니 다.모든 종 류 는 명령 이 요구 하 는 해당 기능 을 실현 할 수 있다 면 수신 자로 서 가능 하 다. 
클 라 이언 트 클래스 (클 라 이언 트):
구체 적 인 명령 대상 을 만 들 고 명령 대상 의 수신 자 를 설정 합 니 다.실제 명령 을 사용 하 는 클 라 이언 트 는 Invoker 에서 실 행 됩 니 다. 
7. 효과
command 모드 장점:
1) 시스템 의 결합 도 를 낮 추기: command 모드 는 호출 작업 의 대상 과 이 작업 을 어떻게 실현 하 는 지 아 는 대상 의 결합 을 해제 합 니 다.
2) Command 는 최고의 대상 이다.그것들 은 다른 대상 처럼 조종 되 고 확 장 될 수 있다.
3) 조합 명령: 여러 명령 을 하나의 조합 명령 으로 조립 할 수 있 습 니 다. 즉, 명령 대기 열과 매크로 명령 을 비교적 쉽게 설계 할 수 있 습 니 다.일반적으로 조합 명령 은 Composite 모드 의 인 스 턴 스 입 니 다.
4) 기 존 클래스 를 바 꿀 필요 가 없 기 때문에 새로운 Command 를 추가 하 는 것 은 쉽다.
5) 요청 에 대한 언 도와 레 도 를 편리 하 게 구현 할 수 있다.
명령 모드 의 단점:
이 가능 하 다, ~ 할 수 있다,...
일부 시스템 에 구체 적 인 명령 류 가 너무 많 습 니 다.모든 명령 에 대해 구체 적 인 명령 류 를 설계 해 야 하기 때문에 일부 시스템 은 구체 적 인 명령 류 를 많이 필요 로 할 수 있 습 니 다. 이것 은 명령 모드 의 사용 에 영향 을 줄 수 있 습 니 다.
8. 실현
텔레비전 리모컨:
텔레비전 은 요청 한 수신 자 이 고,
 리모컨 은 요청 한 발송 자 입 니 다.
 리모컨 에 버튼 이 있 는데, 서로 다른 버튼 은 텔레비전의 서로 다른 조작 에 대응한다.추상 적 인 명령 역할 은 명령 인터페이스 에서 맡 는 다.
 세 가지 구체 적 인 명령 류 는 추상 적 인 명령 인 터 페 이 스 를 실현 했다. 이 세 가지 구체 적 인 명령 류 는 각각 세 가지 조작 을 대표 한다. 텔레비전 을 켜 고 텔레비전 을 끄 고 채널 을 전환 하 는 것 이다.
 분명히 텔레비전 리모컨 은 전형 적 인 명령 모드 응용 실례 이다.
_receiverTV = $receiver;
	}
	public function execute() {
		//               ,           
		$this->_receiverTV->actionOpen();
	}
}
/**
 * ConcreteCommand         :  
 */
class ConcreteCommandClose implements ICommand {
	/**
     *           
     */
	private  $_receiverTV = null; //
	/**
     *   ,            
     */
	private  $_state;
	/**
     *     ,          
     * @param receiver         
     */
	public function  __construct($receiver){
		$this->_receiverTV = $receiver;
	}
	public function execute() {
		//               ,           
		$this->_receiverTV->actionClose();
	}
}

/**
 * ConcreteCommand         :   
 */
class ConcreteCommandChange implements ICommand {
	/**
     *           
     */
	private  $_receiverTV = null; //
	/**
     *   ,            
     */
	private  $_state;
	/**
     *     ,          
     * @param receiver         
     */
	public function  __construct($receiver){
		$this->_receiverTV = $receiver;
	}
	public function execute() {
		//               ,           
		$this->_receiverTV->actionChange();
	}
}

/**
 *      
 */
class ReceiverTV {
	/**
     *              
     */
	public function actionOpen(){
		echo 'actionOpen
'; } /** * */ public function actionClose(){ echo 'actionClose
'; } /** * */ public function actionChange(){ echo 'actionChange
'; } } /** * Invoker: */ class InvokerControler { /** * */ private $_commands = null; //ICommand /** * * @param command */ public function addCommand($command) { $classname = get_class($command); $this->_commands[$classname] = $command; } /** * , */ public function runCommand($cmdName) { // $this->_commands[$cmdName]->execute(); } } class Client { /** * , , */ public static function main(){ // $receiver = new ReceiverTV(); // Invoker $invoker = new InvokerControler(); // , $commandOpen = new ConcreteCommandOpen($receiver); // $invoker->addCommand($commandOpen); // $invoker->runCommand(get_class($commandOpen)); } } Client::main(); ?>

UML 그림:
매크로
조합 명령
네, 그것 도 좋아요.
명령 모드 와 조합 모드
연용 산물:
매크로 명령 도 구체 적 인 명령 이지 만 다른 명령 대상 에 대한 참조 가 포함 되 어 있 습 니 다.
매크로 명령 을 호출 하 는
execute()
방법 은 포 함 된 모든 구성원 명령 을 재 귀적 으로 호출 합 니 다.
execute()
방법.
매크로 명령 의 구성원 대상 은 간단 한 명령 일 수도 있 고 매크로 명령 일 수도 있 습 니 다.매크로 명령 을 실행 하면 여러 개의 구체 적 인 명령 을 실행 하여 명령 에 대한 일괄 처 리 를 실현 합 니 다.
Ÿ
9. 기타 관련 모델
1) Composite 모드 (매크로 명령 을 실현 하 는 데 사용 할 수 있 습 니 다.
2) 비망록 Memento 모드 는 어떤 상 태 를 유지 하 는 데 사용 되 며, 명령 은 이 상태 로 그 효 과 를 취소 합 니 다.역사 표 열 에 넣 기 전에 복사 되 어야 한 다 는 명령 은 원형 역할 을 한다.
10. 정리 와 분석
1)
명령 모드 의 본질은
명령 을 봉인 하 다

명령 을 내 리 는 책임 과 명령 을 집행 하 는 책임 을 분리 하 다.

2)
모든 명령 은 하나의 조작 입 니 다.
요청 한 쪽 에서 요청 을 보 내 작업 을 수행 하 라 고 요구 합 니 다.

받 은 쪽 에서 요청 을 받 고 작업 을 수행 합 니 다.
3)
명령 모드 는 요청 한 쪽 과 받 은 쪽 이 독립 할 수 있 도록 합 니 다.
요청 한 쪽 이 요청 을 받 은 쪽 의 인 터 페 이 스 를 알 필요 가 없 도록 합 니 다.
요청 이 어떻게 받 아들 여 졌 는 지, 작업 이 실 행 됐 는 지, 언제 집 행 됐 는 지 알 필요 도 없다.      그래, 그리고 어떻게 집행 되 었 는 지.
4)
명령 모드
요청 자 체 를 하나의 대상 으로 만들다
이 대상 은 다른 대상 과 마찬가지 로 저장 되 고 전 달 될 수 있다.
5)
명령 모드 의 관건 은
추상 명령 인터페이스 도입
... 뿐만 아니 라
발송 자 추상 명령 인터페이스 프로 그래 밍
추상 적 인 명령 인 터 페 이 스 를 실현 한
구체 적 인 명령 만 수신 자 와 연 결 될 수 있다.

좋은 웹페이지 즐겨찾기