요청을 캡슐화 하여 호출자(Invoker)와 수신자(receiver)를 분리하는 패턴
요청을 처리하는 방법이 바뀌더라도 호출자의 코드는 변경되지 않는다


public interface Command {
void execute();
void undo();
}
public class GameStartCommand implements Command {
private Game game;
public GameStartCommand(Game game) {
this.game = game;
}
@Override
public void execute() {
game.start();
}
@Override
public void undo() {
new GameEndCommand(this.game).execute();
}
}
public class GameEndCommand implements Command {
private Game game;
public GameEndCommand(Game game) {
this.game = game;
}
@Override
public void execute() {
game.end();
}
@Override
public void undo() {
new GameStartCommand(this.game).execute();
}
}
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
@Override
public void undo() {
new LightOnCommand(this.light).execute();
}
}
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(this.light).execute();
}
}
public class Button {
private Stack<Command> commands = new Stack<>();
public void press(Command command) {
command.execute();
commands.push(command);
}
public void undo() {
if (!commands.isEmpty()) {
Command command = commands.pop();
command.undo();
}
}
public static void main(String[] args) {
Button button = new Button();
button.press(new GameStartCommand(new Game()));
button.press(new LightOnCommand(new Light()));
button.undo();
button.undo();
}
}
public class MyApp {
private Command command;
public MyApp(Command command) {
this.command = command;
}
public void press() {
command.execute();
}
public static void main(String[] args) {
MyApp myApp = new MyApp(new GameStartCommand(new Game()));
}
}
- 장점
- 기존 코드를 변경하지 않고 새로운 커맨드를 만들 수 있다
- 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않는다
- 커맨드 객체를 로깅, DB에 저장, 네트워크로 전송 하는 등 다양한 방법으로 활용할 수도 있다
- 단점
- 코드가 복잡하고 클래스가 많아진다
코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의
디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할
www.inflearn.com
'java' 카테고리의 다른 글
Design Patterns - Chain of Responsibility (0) | 2022.01.30 |
---|---|
Design Patterns - Proxy (0) | 2022.01.16 |
Design Patterns - Flyweight (0) | 2021.12.21 |
Design Patterns - Facade (0) | 2021.12.10 |
Design Patterns - Decorator (0) | 2021.12.04 |
댓글