java 디자인 모드 (5) - 명령 모드
다른 요청, 대기열, 로그를 사용하여 다른 대상을 매개 변수화할 수 있도록 요청을 '대상' 으로 봉합니다.명령 모드에서도 실행 취소 동작을 지원합니다.
자신의 이해: 특정 수신자에 하나의 동작을 연결해서 요청을 봉인하고, 하나의 excute () 방법만 노출합니다.그 다음에 이 대상을 매개 변수로 다른 클래스나 대상 (호출자) 에게 전달하고 호출자가 excute () 를 호출할 때 수신자는 해당하는 동작을 한다.
2. 역할
명령 대상은 특정 수신자에 연결된 동작을 통해 요청을 봉인합니다.이 점을 달성하려면 명령 대상은 동작과 수신자를 대상에 포함시킨다.이 대상은 하나의 excute () 방법만 노출되며, 이 방법이 호출될 때 수신자가 이 동작을 합니다.
주요 사항:
(1) 명령 모드는 요청을 보내는 대상과 실행하는 대상을 결합시킨다.
(2) 결합된 양자 간에 명령 대상을 통해 소통한다.명령 대상은 수신자와 한 조 또는 한 조의 대작을 봉인했다.
(3) 호출자는 명령 대상을 호출하는 exceute () 를 통해 요청을 보내고 수신자의 동작을 호출합니다.
(4) 호출자는 명령을 인수하여 매개 변수로 하고 심지어 실행할 때 동적으로 진행한다.
3. 원칙에 의존한다
(1) 포장 변화
(2) 다용도 조합, 소용도 계승
(3) 구체적인 실현이 아니라 인터페이스에 대한 프로그래밍
(4) 상호작용 대상 간의 느슨한 결합 디자인을 위해 노력
(5) 클래스는 확장에 개방하고 수정에 닫아야 한다
(6) 추상에 의존하고 구체류에 의존하지 않는다
4. 구체적 실현
4.1 유형도
4.2 코드 구현
// ,
package test;
import invoke.RemoteControl;
import receiver.GarageDoor;
import receiver.Light;
import command.GarageDoorCloseCommand;
import command.GarageDoorOpenCommand;
import command.LightOffCommand;
import command.LightOnCommand;
public class RemoteLoader {
public static void main(String args[]){
RemoteControl remoteControl = new RemoteControl();
Light light = new Light();
LightOnCommand lightOnCommand = new LightOnCommand(light);
LightOffCommand lightOffCommand = new LightOffCommand(light);
remoteControl.setCommand(0, lightOnCommand, lightOffCommand);
remoteControl.onButtonwasPressed(0);
remoteControl.offButtonwasPressed(0);
GarageDoor garageDoor = new GarageDoor();
GarageDoorOpenCommand garageDoorOpenCommand = new GarageDoorOpenCommand(garageDoor);
GarageDoorCloseCommand garageDoorCloseCommand = new GarageDoorCloseCommand(garageDoor);
remoteControl.setCommand(1, garageDoorOpenCommand, garageDoorCloseCommand);
remoteControl.onButtonwasPressed(1);
remoteControl.offButtonwasPressed(1);
}
}
//
package receiver;
public class GarageDoor {
public GarageDoor() {
}
public void open() {
System.out.println("grageDoor is open");
}
public void close() {
System.out.println("grageDoor is close");
}
}
//
package receiver;
public class Light {
public Light() {
}
public void on() {
System.out.println("light is on");
}
public void off() {
System.out.println("light is off");
}
}
//
package invoke;
import command.Command;
import command.NoCommand;
public class RemoteControl {
Command[] onCommands;
Command[] offCommands;
public RemoteControl(){
onCommands = new Command[7];
offCommands = new Command[7];
for(int i=0;i<7;i++){
onCommands[i] = new NoCommand();
offCommands[i] = new NoCommand();
}
}
public void setCommand(int i ,Command onCommand,Command offCommand) {
onCommands[i] = onCommand;
offCommands[i] = offCommand;
}
public void onButtonwasPressed(int i) {
onCommands[i].execute();
}
public void offButtonwasPressed(int i){
offCommands[i].execute();
}
}
// : 。
package command;
public interface Command {
public void execute();
}
package command;
import receiver.GarageDoor;
public class GarageDoorCloseCommand implements Command {
GarageDoor garageDoor;
public GarageDoorCloseCommand(GarageDoor garageDoor) {
this.garageDoor = garageDoor;
}
@Override
public void execute() {
garageDoor.close();
}
}
package command;
import receiver.GarageDoor;
public class GarageDoorOpenCommand implements Command {
GarageDoor garageDoor;
public GarageDoorOpenCommand(GarageDoor garageDoor) {
this.garageDoor = garageDoor;
}
@Override
public void execute() {
garageDoor.open();
}
}
package command;
import receiver.Light;
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.off();
}
}
package command;
import receiver.Light;
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
package command;
public class NoCommand implements Command {
@Override
public void execute() {
System.out.println("no");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.