출처 : https://gmlwjd9405.github.io/2018/07/07/command-pattern.html
예시
Invoker : Command로 부터 기능을 실행해 달라고 요청하는 호출클래스
Command : ConcreteCommand의 실행 기능에 대한 인터페이스로 실행은 execute, 취소는 undo 같은 메서드로 선언해준다.
ConcreteCommand : 실제로 실행되는 기능을 구현함
/**
* Invoker
*/
public class Button {
private Command command;
private Stack<Command> commands = new Stack<Command>();
public Button() {
}
public void undo() {
if (!commands.isEmpty()) {
commands.pop().undo();
}
}
// 커맨드의 인터페이스를 사용함.
public void press(Command command) {
command.execute();
commands.push(command);
}
}
/**
* Command
*/
public interface Command {
//Concrete Command의 공통 메서드 정의
void execute();
void undo();
}
/**
* Concrete Command
* 불키는 동작을 하는 구체 커맨드
* */
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
//불킴
@Override
public void execute() {
light.on();
}
//불끔
@Override
public void undo() {
new LightOffCommand(new Light()).execute();
}
}
/**
* Receiver
* 기능을 하는 객체
* */
public class Light {
private boolean isOn;
public void on() {
System.out.println("불을 켭니다.");
this.isOn = true;
}
public void off() {
System.out.println("불을 끕니다.");
this.isOn = false;
}
public boolean isOn() {
return this.isOn;
}
}
public class inJava {
public static void main(String[] args) {
Light light = new Light();
Game game = new Game();
ExecutorService executorService = Executors.newFixedThreadPool(4);
/**
* runnable 이 여기서 command interFace
* functional InterFace
* */
executorService.submit(new Runnable() {
@Override
public void run() {
}
});
executorService.submit(light::off); //Method Reference
executorService.submit(() -> light.on());// Lambda Expressions
executorService.shutdown();
}
}
public class inSpring {
private DataSource dataSource;
public inSpring(DataSource dataSource) {
this.dataSource = dataSource;
}
public void add(Command command) {
/**
* SimpleJdbcInsert -> 일종의 Command 구현체
* */
SimpleJdbcInsert insert = new SimpleJdbcInsert(dataSource)
.withTableName("command")
.usingGeneratedKeyColumns("id");
Map<String, Object> data = new HashMap<>();
data.put("name", command.getClass().getSimpleName());
data.put("when", LocalDateTime.now());
insert.execute(data);
}
}
출처 : 백기선님의 디자인패턴