java 디자인 모드 (5) - 명령 모드

4390 단어
1. 개념:
다른 요청, 대기열, 로그를 사용하여 다른 대상을 매개 변수화할 수 있도록 요청을 '대상' 으로 봉합니다.명령 모드에서도 실행 취소 동작을 지원합니다.
자신의 이해: 특정 수신자에 하나의 동작을 연결해서 요청을 봉인하고, 하나의 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");
	}

}

좋은 웹페이지 즐겨찾기