π‘ 컀맨λ(Command) ν¨ν΄μ΄λ?
μμ²(κΈ°λ₯)μ μΊ‘μννμ¬ μμ²μ λν λͺ¨λ μ 보λ₯Ό κ°μ²΄ννλ νλ λμμΈ ν¨ν΄μ λλ€. μμ²μ λν μ 보λ‘λ λ©μλ μ΄λ¦, 맀κ°λ³μ λ±μ΄ μμΌλ©°, μ¬μ©μκ° λ³΄λΈ μμ²μ μ μ₯, λ‘κΉ , λλ μ·¨μν μ μμ΅λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ 컀맨λ ν¨ν΄
- λ°λμ(Invoker) : μμ²λ€μ μμνλ μν μ νλ ν΄λμ€λ‘, μμ μ λμ 컀맨λ κ°μ²΄λ₯Ό μλμν΄μΌλ‘μ¨ μμ²ν©λλ€. λ, μμ²μ λν κΈ°λ‘μ λ¨κΈΈ μ μκ³ , ν λ°λμ κ°μ²΄μ λ€μμ 컀맨λ κ°μ²΄κ° μ λ¬λ μ μμ΅λλ€.
- Command Interface : μΌλ°μ μΌλ‘ 컀맨λλ₯Ό μ€ννκΈ° μν λ¨μΌ λ©μλλ§μ μ μΈν©λλ€.
- Concrete Command : λ€μν μ νμ μμ²μ ꡬν. μ체μ μΌλ‘ μμ μ μνν΄μλ μ λλ©°, λμ μμ μμ λ©μλλ₯Ό νΈμΆν©λλ€. μμ κ°μ²΄μμ λ©μλλ₯Ό μ€ννλ λ° νμν λ§€κ° λ³μλ€μ ꡬμ 컀맨λμ νλλ€λ‘ μ μΈν μ μμ΅λλ€. μμ±μλ₯Ό ν΅ν΄μλ§ μ΄λ¬ν νλλ€μ μ΄κΈ°νλ₯Ό νμ©ν¨μΌλ‘μ¨ μ»€λ§¨λ κ°μ²΄λ€μ λΆλ³μΌλ‘ λ§λ€ μ μμ΅λλ€.
- μμ μ(Receiver) : μΌλΆ λΉμ¦λμ€ λ‘μ§μ΄ ν¬ν¨λμ΄ μμΌλ©°, 컀맨λ κ°μ²΄κ° μμ μμ λ©μλλ₯Ό νΈμΆνλ©΄ μ μλ λ©μλλ₯Ό μνν©λλ€. λλΆλΆμ 컀맨λλ€μ μμ²μ΄ μμ μμκ² μ λ¬λλ λ°©λ²μ λν μΈλΆ μ λ³΄λ§ μ²λ¦¬νλ λ°λ©΄ μμ μ μ체λ μ€μ μμ μ μνν©λλ€.
- Client : λ°λμ κ°μ²΄λ‘ 컀맨λ κ°μ²΄λ₯Ό μ λ¬νλ©°, μ΄λ μμ μμ μ΄λ€ λͺ λ Ήμ μνν μ§λ₯Ό κ²°μ ν©λλ€.
π‘ μ λ΅ ν¨ν΄ ꡬν
// Command μΈν°νμ΄μ€
public interface Command {
void execute();
void undo();
}
// Receiver ν΄λμ€ : μ€μ λ‘ μμ
μ μννλ κ°μ²΄
public class TV {
public void on() {
System.out.println("TV is ON");
}
public void off() {
System.out.println("TV is OFF");
}
}
// Concrete Command
public class TVOnCommand implements Command {
private TV tv;
public TVOnCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.on();
}
@Override
public void undo() {
tv.off();
}
}
public class TVOffCommand implements Command {
private TV tv;
public TVOffCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.off();
}
@Override
public void undo() {
tv.on();
}
}
// Invoker ν΄λμ€
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
public void pressUndo() {
command.undo();
}
}
// Client
public class Client {
public static void main(String[] args) {
TV tv = new TV();
Command tvOn = new TVOnCommand(tv);
Command tvOff = new TVOffCommand(tv);
RemoteControl remote = new RemoteControl();
// TV μΌκΈ°
remote.setCommand(tvOn);
remote.pressButton();
// TV λκΈ°
remote.setCommand(tvOff);
remote.pressButton();
// Undo (TV μΌκΈ°)
remote.pressUndo();
}
}
π‘ λ§λ¬΄λ¦¬
컀맨λ ν¨ν΄μ
- μμ μ κ°μ²΄ννμ¬ λ§€κ°λ³μννκ³ μΆμ λ
- μμ λ€μ μ€νμ μμ½ νΉμ μ격μΌλ‘ μ€ννκ³ μΆμ λ
- λλ릴 μ μλ μμ μ ꡬννκ³ μΆμ λ
μ μ¬μ©ν μ μμ΅λλ€.
컀맨λ ν¨ν΄μ μ¬μ©νλ©΄ μμ μ νΈμΆνλ ν΄λμ€λ€μ μμ μ μννλ ν΄λμ€λ€λ‘λΆν° λΆλ¦¬ν μ μκ³ (SRP μ€μ), κΈ°μ‘΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μμ νμ§ μκ³ λ μ 컀맨λλ₯Ό λμ ν μ μμ΅λλ€.(OCP μ€μ)
λ°μν