Command

Command ํŒจํ„ด์€ ์‹คํ–‰๋  ๊ธฐ๋Šฅ(๋ช…๋ น)์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์บก์Аํ™”ํ•˜์—ฌ, ํ˜ธ์ถœ์ž์™€ ์ˆ˜ํ–‰์ž ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๋ช…๋ น์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ํ์ž‰, ์ทจ์†Œ ๊ธฐ๋Šฅ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™•์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

          +---------------------+
          |     Command         |  <-- ์‹คํ–‰ํ•  ๊ธฐ๋Šฅ์„ ์บก์Аํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
          +---------------------+
          | + execute()         |
          +---------------------+
                   โ–ฒ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                   โ”‚
+----------------------+  +----------------------+
| ConcreteCommand1     |  | ConcreteCommand2     |  <-- ๊ตฌ์ฒด์ ์ธ ๋ช…๋ น ๊ตฌํ˜„
+----------------------+  +----------------------+
| - receiver: Receiver |  | - receiver: Receiver |  
| + execute()          |  | + execute()          |
+----------------------+  +----------------------+
                   โ”‚
                   โ–ผ
            +--------------+
            |   Receiver |  <-- ๋ช…๋ น์„ ์‹ค์ œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด
            +--------------+
            | + action()   |
            +--------------+
                   โ–ฒ
                   โ”‚
            +--------------+
            |   Invoker  |  <-- ๋ช…๋ น ์‹คํ–‰์„ ์š”์ฒญํ•˜๋Š” ๊ฐ์ฒด
            +--------------+
            | - command: Command |
            | + setCommand(c: Command) |
            | + invoke()           |
            +--------------+

์ฆ‰, ์‹คํ–‰ํ•  ์ž‘์—…์„ Command ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ Command ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด Command ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


How do Codeโ”

// Command ์ธํ„ฐํŽ˜์ด์Šค: ์‹คํ–‰ํ•  ๋ช…๋ น์„ ์ •์˜
public interface Command {
    void execute();
}

// Receiver: ๋ช…๋ น์„ ์‹ค์ œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด
public class Receiver {
    public void action() {
        System.out.println("Receiver์˜ action() ๋ฉ”์„œ๋“œ ์‹คํ–‰");
    }
}

// ConcreteCommand: Command ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„, Receiver๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰
public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        System.out.println("ConcreteCommand: execute() ํ˜ธ์ถœ");
        receiver.action();
    }
}

// Invoker: ๋ช…๋ น ์‹คํ–‰์„ ์š”์ฒญํ•˜๋Š” ๊ฐ์ฒด
public class Invoker {
    private Command command;

    // ๋ช…๋ น ๊ฐ์ฒด๋ฅผ ์„ค์ •
    public void setCommand(Command command) {
        this.command = command;
    }

    // ์„ค์ •๋œ ๋ช…๋ น์„ ์‹คํ–‰
    public void invoke() {
        if (command != null) {
            command.execute();
        }
    }
}
  • Command ์ธํ„ฐํŽ˜์ด์Šค

    • execute() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ, ํ˜ธ์ถœ ์‹œ ์‹คํ–‰๋  ๊ธฐ๋Šฅ์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ConcreteCommand ํด๋ž˜์Šค:

    • Command ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋‚ด๋ถ€์— Receiver ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • execute() ํ˜ธ์ถœ ์‹œ Receiver์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • Receiver

    • ์‹ค์ œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋กœ, Command ๊ฐ์ฒด์— ์˜ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

  • Invoker

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ช…๋ น ์‹คํ–‰์„ ์š”์ฒญํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

    • Command ๊ฐ์ฒด๋ฅผ ์„ค์ •(setCommand)ํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ invoke() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์ 

    • ๋ช…๋ น ์บก์Аํ™”๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ์ž์™€ ์ˆ˜ํ–‰์ž ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉฐ, ๋ช…๋ น์„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ช…๋ น ํ, ์ทจ์†Œ(undo), ๋กœ๊น… ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ํ™•์žฅ์ด ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

Last updated