JAVA 디자인 모드 - 명령 모드

3678 단어
명령 모드
'요청' 을 대상으로 봉하여 다른 요청, 대기열, 로그를 사용하여 다른 대상을 매개 변수화할 수 있도록 합니다.명령 모드에서도 취소 가능한 조작을 지원합니다.
우리는 명령 대상이 특정 수신자에 연결된 동작을 통해 요청을 봉인하는 것을 알고 있다.이 점을 달성하려면 명령 대상은 동작과 수신자를 대상에 포함시킨다.이 대상은excute () 방법만 노출되며, 이 방법이 호출되면 수신자가 이 동작을 합니다.밖에서 보면 다른 대상은 도대체 어떤 수신자가 어떤 동작을 했는지 모르고execute () 방법을 사용하면 요청의 목적을 달성할 수 있다는 것만 알 뿐이다.
구체적 예
모든 명령 대상이 같은 인터페이스를 사용합니다: Command.java
package com.designpattern.command;

public interface Command {
	public void execute();
	public void undo();
	
}

Light.java
package com.designpattern.command;

public class Light {
	private boolean on = false;

	public void on() {
		this.on = true;
	}

	public void off() {
		this.on = false;
	}

	public String getStatus() {
		if (on) {
			return "ON";
		} else {
			return "OFF";
		}
	}
}

불을 켠 명령 개체: OnCommand.java, 동작과 수신자 간의 귀속 관계를 정의합니다.호출자는execute () 방법을 호출하면 요청을 보내고 수신자의 한 동작 또는 여러 동작을 호출할 수 있습니다.
package com.designpattern.command;

public class OnCommand implements Command {
	private Light light;

	public OnCommand(Light l) {
		this.light = l;
	}

	@Override
	public void execute() {
		light.on();
	}

	@Override
	public void undo() {
		light.off();
		System.out.println("The light is off!");
	}

}
불을 끄는 명령 개체: OffCommand.java
package com.designpattern.command;

public class OffCommand implements Command {

	private Light light;
	
	public OffCommand(Light l){
		this.light = l;
	}
	
	@Override
	public void execute() {
		light.off();
	}

	@Override
	public void undo() {
		light.on();
		System.out.println("The light is on!");
	}

}

빈 명령: NoCommand.java,null 처리의 책임을 빈 명령 대상에게 이전합니다. excute () 방법을 호출할 때, 이 대상은 아무것도 하지 않습니다.
package com.designpattern.command;

public class NoCommand implements Command {

	@Override
	public void execute() {
		// TODO Auto-generated method stub

	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub

	}

}

호출자: Invoker.java, 명령 대상을 가지고 있으며, 어느 시점에 명령 대상의excute () 방법을 호출하여 요청을 실행에 옮깁니다.
package com.designpattern.command;

// 
public class Invoker {

	private Command command;

	private Command undoCommand;

	public Invoker() {
		command = new NoCommand();
		undoCommand = new NoCommand();
	}

	public void setCommand(Command c) {
		this.command = c;
	}

	public void pressButton() {
		this.command.execute();
		undoCommand = command;
	}

	public void undoPress() {
		undoCommand.undo();
	}
}

테스트 클래스: Test.java, 구체적인 명령을 만들고 수신자를 설정합니다.
package com.designpattern.command;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Light light = new Light();
		
		Command on = new OnCommand(light);// ,light 
		Command off = new OffCommand(light);
		
		Invoker invoker = new Invoker();
		invoker.setCommand(on);
		invoker.pressButton();
		invoker.undoPress();
		
		System.out.println("Light  "+light.getStatus());
	}

}

         
주요 사항 요약
1. 명령 모드는 요청을 보내는 대상과 실행하는 대상을 결합시킨다.
2. 결합된 양자 간에 명령 대상을 통해 의사소통을 한다.명령 대상은 수신자와 한 조의 동작을 봉인했다.
3. 호출자는 명령 대상을 호출하는excute() 방법을 통해 요청을 보내면 수신자의 동작을 호출할 수 있다.
4. 호출자는 명령을 매개 변수로 받아들일 수 있고 심지어 실행할 때 동적으로 진행할 수 있다.
5, 명령은 취소를 지원할 수 있습니다. 방법은 undo () 방법으로execute ()가 실행되기 전의 상태로 돌아가는 것입니다.
6, 매크로 명령은 명령의 간단한 연장으로 여러 명령을 호출할 수 있다.매크로 방법도 취소를 지원할 수 있습니다.
7. 실제 작업을 할 때'똑똑한'명령 대상을 사용하는 것이 흔하다. 즉, 요청을 직접 실현하는 것이지 수취자에게 업무를 위탁하는 것이 아니다.
8. 명령은 로그와 사무 시스템을 실현하는 데도 사용할 수 있다.

좋은 웹페이지 즐겨찾기