《 헤드 퍼스트 디자인 모델 》 읽 기 노트. 제6 장
인용 하 다.
해답 을 연거푸 보다
여급 - > 인보 커
패스트푸드 요리사 - > 수신 기
orderUp()->execute()
주문 - > Command
고객 - > 고객
takeOrder()->setCommand
------------
----GarageDoorOpenCommand ----
public class GarageDoorOpenCommand {
GarageDoor door;
public GarageDoorOpenCommand(GarageDoor door){
this.door = door;
}
public void execute() {
door.up();
}
}
------------
명령 (command) 모드: 요청, 대기 열, 로 그 를 사용 하여 다른 대상 을 매개 변수 화 할 수 있 도록 '요청' 을 대상 으로 봉 합 니 다.명령 모드 에서 도 취소 가능 한 동작 을 지원 합 니 다.
* 명령 대상 은 특정 수신 자 에 게 동작 을 연결 하여 요청 을 봉인 합 니 다.이 를 위해 명령 대상 은 동작 과 수용 자 를 대상 에 포함 시 켰 다.
* 빈 대상 (null object) 은 무의미 한 대상 으로 돌아 갈 때 null 을 처리 하 는 책임 을 질 수 있 습 니 다.때로는 빈 대상 도 디자인 모델 로 여 겨 진다.
* 명령 이 실행 되 기 전의 상 태 를 명령 대상 에 기록 하면 더욱 복잡 한 취소 작업 을 할 수 있 습 니 다.
----CeilingFanLowCommand ----
public class CeilingFanLowCommand implements Command {
private CeilingFan fan;
private int prevSpeed;
public CeilingFanLowCommand(CeilingFan fan) {
this.fan = fan;
}
public void execute() {
prevSpeed = fan.getSpeed();
fan.low();
}
public void undo() {
if (prevSpeed == CeilingFan.HIGH) {
fan.high();
} else if (prevSpeed == CeilingFan.MEDIUM) {
fan.medium();
} else if (prevSpeed == CeilingFan.LOW) {
fan.low();
} else if (prevSpeed == CeilingFan.OFF) {
fan.off();
}
}
}
------------
----CeilingFanMediumCommand ----
public class CeilingFanMediumCommand implements Command {
private CeilingFan fan;
private int prevSpeed;
public CeilingFanMediumCommand(CeilingFan fan) {
this.fan = fan;
}
public void execute() {
prevSpeed = fan.getSpeed();
fan.medium();
}
public void undo() {
if (prevSpeed == CeilingFan.HIGH) {
fan.high();
} else if (prevSpeed == CeilingFan.MEDIUM) {
fan.medium();
} else if (prevSpeed == CeilingFan.LOW) {
fan.low();
} else if (prevSpeed == CeilingFan.OFF) {
fan.off();
}
}
}
------------
----CeilingFanOffCommand ----
public class CeilingFanOffCommand implements Command {
private CeilingFan fan;
private int prevSpeed;
public CeilingFanOffCommand(CeilingFan fan) {
this.fan = fan;
}
public void execute() {
prevSpeed = fan.getSpeed();
fan.off();
}
public void undo() {
if (prevSpeed == CeilingFan.HIGH) {
fan.high();
} else if (prevSpeed == CeilingFan.MEDIUM) {
fan.medium();
} else if (prevSpeed == CeilingFan.LOW) {
fan.low();
} else if (prevSpeed == CeilingFan.OFF) {
fan.off();
}
}
}
------------
* 매크로 명령 (Macro Command) 은 같은 명령 인 터 페 이 스 를 실현 하 는 클래스 를 포함 하 는 명령 대기 열 입 니 다.
----Sharpen Your Pencil ----
Light light = new Light("Living Room");
TV tv = new TV("Living Room");
Stereo stereo = new Stereo("Living Room");
Hottub hottub = new Hottub();
LightOffCommand lightoff = new LightOffCommand(light);
TVOffCommand tvoff = new TVOffCommand(tv);
StereoOffCommand stereooff = new StereoOffCommand(stereo);
HottubOffCommand hottuboff = new HottubOffCommand(hottub);
------------
----undo() ----
public void undo() {
//
for(int i = commands.length() - 1; i >= 0; i--) {
commands[i].undo();
}
}
------------
* 명령 (Command) 모드 는 수신 자 를 매개 변수 로 전달 하고 모든 명령 대상 이 하나의 명령 인 터 페 이 스 를 실현 하 는 방식 으로 인터페이스 프로 그래 밍 을 실현 하여 호출 자 와 수신 자 간 에 디 결합 을 실현 합 니 다.
* 호출 자 에 게 연속 으로 실행 되 는 명령 을 스 택 으로 기록 하면 단 추 를 누 를 때마다 취소 작업 을 수행 하 는 연속 취소 기능 을 실현 할 수 있 습 니 다.
* 명령 (Command) 모드 는 요청 한 대상 과 요청 한 대상 의 결합 을 해제 합 니 다.
* 해 제 된 대상 간 에 명령 대상 을 통 해 의사 소통 을 하고 명령 대상 은 수용자 와 하나 또는 한 그룹의 동작 을 봉인 합 니 다.
* 매크로 명령 은 명령 의 간단 한 연장 으로 여러 명령 을 호출 합 니 다.매크로 방법 도 취 소 를 지원 할 수 있 습 니 다.
* 실제 작업 시 수신 자 에 게 업무 의뢰 (Delegate) 를 하 는 대신 '똑똑 한' 명령 대상, 즉 직접 요청 을 하 는 경우 가 흔 하 다.
* 명령 은 로그 와 사물 시스템 을 실현 하 는 데 사 용 될 수 있 습 니 다.
2. 명령 (Command) 모드 인 스 턴 스
// mp3
public class Mp3Player {
private String name;
public Mp3Player(String n) {
this.name = n;
}
public void playMusic() {
System.out.println("Music is playing.");
}
public void stopMusic() {
System.out.println("Music is stopped.");
}
public String getName() {
return name;
}
}
//
public class Radio {
private float frequency = 100;//
private String name;
public Radio(String n) {
this.name = n;
}
public void on() {
System.out.println("Radio is on.");
}
public void off() {
System.out.println("Radio is off.");
}
public void setFrequency(float f) {
this.frequency = f;
System.out.println("Frequency is set to " + f);
}
public float getFrequency() {
return this.frequency;
}
public String getName() {
return name;
}
}
//
public interface Command {
public void execute();
public void undo();
}
//
public class PlayMusicCommand implements Command {
private Mp3Player player;
public PlayMusicCommand(Mp3Player p) {
this.player = p;
}
public void execute() {
this.player.playMusic();
}
public void undo() {
this.player.stopMusic();
}
}
//
public class StopMusicCommand implements Command {
private Mp3Player player;
public StopMusicCommand(Mp3Player p) {
this.player = p;
}
public void execute() {
this.player.stopMusic();
}
public void undo() {
this.player.playMusic();
}
}
//
public class RadioOnCommand implements Command {
private Radio radio;
public RadioOnCommand(Radio p) {
this.radio = p;
}
public void execute() {
this.radio.on();
}
public void undo() {
this.radio.off();
}
}
//
public class RadioOffCommand implements Command {
private Radio radio;
public RadioOffCommand(Radio p) {
this.radio = p;
}
public void execute() {
this.radio.off();
}
public void undo() {
this.radio.on();
}
}
//
public class FrequencyHigherCommand implements Command {
private Radio radio;
private float prevFre;
public FrequencyHigherCommand(Radio p) {
this.radio = p;
}
public void execute() {
this.prevFre = radio.getFrequency();
radio.setFrequency(this.prevFre + 0.1f);
}
public void undo() {
this.radio.setFrequency(prevFre);
}
}
//
public class FrequencylowerCommand implements Command {
private Radio radio;
private float prevFre;
public FrequencylowerCommand(Radio p) {
this.radio = p;
}
public void execute() {
this.prevFre = radio.getFrequency();
if (this.prevFre >= 0.1)
radio.setFrequency(this.prevFre - 0.1f);
}
public void undo() {
this.radio.setFrequency(prevFre);
}
}
//
public class RemoteControl {
private Command[] leftCommands;
private Command[] rightCommands;
private Command prevCommand;
public RemoteControl() {
leftCommands = new Command[3];
rightCommands = new Command[3];
for (int i = 0; i < leftCommands.length; i++) {
leftCommands[i] = new NoCommand();
}
for (int i = 0; i < rightCommands.length; i++) {
rightCommands[i] = new NoCommand();
}
prevCommand = new NoCommand();
}
public void setCommand(int index, Command left, Command right) {
leftCommands[index] = left;
rightCommands[index] = right;
}
public void leftButtonPressed(int index) {
System.out.println("Left button [" + index + "] is pressed.");
leftCommands[index].execute();
prevCommand = leftCommands[index];
}
public void rightButtonPressed(int index) {
System.out.println("Right button [" + index + "] is pressed.");
rightCommands[index].execute();
prevCommand = rightCommands[index];
}
public void cancelButtonPressed() {
System.out.println("Cancel button is pressed.");
prevCommand.undo();
}
}
// , (null object)
public class NoCommand implements Command {
public void execute() {
}
public void undo() {
}
}
---- (Command) ----
//
public class TestRemoteControl {
public static void main(String[] args) {
RemoteControl rc = new RemoteControl();
Mp3Player player = new Mp3Player("Sony Ericsson");
PlayMusicCommand pm = new PlayMusicCommand(player);
StopMusicCommand sm = new StopMusicCommand(player);
rc.setCommand(0, pm, sm);
Radio radio = new Radio("Tecsun");
RadioOnCommand ron = new RadioOnCommand(radio);
RadioOffCommand roff = new RadioOffCommand(radio);
FrequencyHigherCommand fh = new FrequencyHigherCommand(radio);
FrequencylowerCommand fl = new FrequencylowerCommand(radio);
rc.setCommand(1, ron, roff);
rc.setCommand(2, fh, fl);
rc.leftButtonPressed(0);
rc.cancelButtonPressed();
rc.leftButtonPressed(0);
rc.rightButtonPressed(0);
rc.cancelButtonPressed();
rc.leftButtonPressed(1);
rc.cancelButtonPressed();
rc.leftButtonPressed(1);
rc.rightButtonPressed(1);
rc.cancelButtonPressed();
rc.leftButtonPressed(2);
rc.cancelButtonPressed();
rc.leftButtonPressed(2);
rc.rightButtonPressed(2);
rc.cancelButtonPressed();
}
}
인용 하 다.
- 테스트 프로그램 실행 결과 -
Left button [0] is pressed.
Music is playing.
Cancel button is pressed.
Music is stopped.
Left button [0] is pressed.
Music is playing.
Right button [0] is pressed.
Music is stopped.
Cancel button is pressed.
Music is playing.
Left button [1] is pressed.
Radio is on.
Cancel button is pressed.
Radio is off.
Left button [1] is pressed.
Radio is on.
Right button [1] is pressed.
Radio is off.
Cancel button is pressed.
Radio is on.
Left button [2] is pressed.
Frequency is set to 100.1
Cancel button is pressed.
Frequency is set to 100.0
Left button [2] is pressed.
Frequency is set to 100.1
Right button [2] is pressed.
Frequency is set to 100.0
Cancel button is pressed.
Frequency is set to 100.1
------------
3. 매크로 명령 (매크로 명령) 인 스 턴 스
상기 코드 를 바탕 으로 완성:
//
public class MacroCommand implements Command {
private Command[] commands;
public MacroCommand(Command[] commands) {
this.commands = commands;
}
public void execute() {
for (int i = 0; i < commands.length; i++) {
commands[i].execute();
}
}
public void undo() {
for (int i = commands.length - 1; i >= 0; i--) {
commands[i].undo();
}
}
}
---- (Macro Command) ----
//
public class TestMacroCommand {
public static void main(String[] args) {
Mp3Player player = new Mp3Player("Sony Ericsson");
PlayMusicCommand pm = new PlayMusicCommand(player);
StopMusicCommand sm = new StopMusicCommand(player);
Radio radio = new Radio("Tecsun");
RadioOnCommand ron = new RadioOnCommand(radio);
RadioOffCommand roff = new RadioOffCommand(radio);
FrequencyHigherCommand fh = new FrequencyHigherCommand(radio);
FrequencylowerCommand fl = new FrequencylowerCommand(radio);
FrequencyHigherCommand fh2 = new FrequencyHigherCommand(radio);
FrequencylowerCommand fl2 = new FrequencylowerCommand(radio);
Command[] commands = new Command[] { pm, sm, ron, fh, fh2, fl, fl2, roff };
MacroCommand mc = new MacroCommand(commands);
RemoteControl rc = new RemoteControl();
rc.setCommand(0, mc, mc);
rc.leftButtonPressed(0);
rc.cancelButtonPressed();
}
}
인용 하 다.
- 테스트 프로그램 실행 결과 -
Left button [0] is pressed.
Music is playing.
Music is stopped.
Radio is on.
Frequency is set to 100.1
Frequency is set to 100.2
Frequency is set to 100.1
Frequency is set to 100.0
Radio is off.
Cancel button is pressed.
Radio is on.
Frequency is set to 100.1
Frequency is set to 100.2
Frequency is set to 100.1
Frequency is set to 100.0
Radio is off.
Music is playing.
Music is stopped.
--------
4. 똑똑 한 명령 (Smart Command) 인 스 턴 스
상기 코드 를 바탕 으로 완성:
// (Smart)
public class PrintLogCommand implements Command {
public void execute() {
// ,
System.out.println("Log at " + new Date());
}
public void undo() {
// ,
}
}
---- (Smart Command) ----
//
public class TestSmartCommand {
public static void main(String[] args) {
PrintLogCommand pl = new PrintLogCommand();
RemoteControl rc = new RemoteControl();
rc.setCommand(0, pl, pl);
rc.leftButtonPressed(0);
}
}
인용 하 다.
- 테스트 프로그램 실행 결과 -
Left button [0] is pressed.
Log at Tue Jan 19 14:44:02 CST 2010
------------
--END--
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.