6_oHji
6_oHji
ν™˜μ˜ν•©λ‹ˆλ‹€☺
GitHub   Gmail
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (62)
    • πŸ’‘ DEEP DIVE (17)
      • PATTERN (17)
    • πŸ“ 끄적끄적 (4)
    • 🌈 EXPERIENCE (3)
    • πŸ’» PROJECT (3)
    • πŸ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

κ°œμΈμ •λ³΄

  • ν‹°μŠ€ν† λ¦¬ ν™ˆ
  • μŠ€ν† λ¦¬
  • 포럼
  • 둜그인
hELLO Β· Designed By μ •μƒμš°.
6_oHji
6_oHji
Deep Dive Into Design Patterns - μ»€λ§¨λ“œ νŒ¨ν„΄
πŸ’‘ DEEP DIVE/PATTERN

Deep Dive Into Design Patterns - μ»€λ§¨λ“œ νŒ¨ν„΄

2024. 5. 27. 23:39

 

πŸ’‘ μ»€λ§¨λ“œ(Command) νŒ¨ν„΄μ΄λž€?

μš”μ²­(κΈ°λŠ₯)을 μΊ‘μŠν™”ν•˜μ—¬ μš”μ²­μ— λŒ€ν•œ λͺ¨λ“  정보λ₯Ό κ°μ²΄ν™”ν•˜λŠ” 행동 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. μš”μ²­μ— λŒ€ν•œ μ •λ³΄λ‘œλŠ” λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜ 등이 있으며, μ‚¬μš©μžκ°€ 보낸 μš”μ²­μ„ μ €μž₯, λ‘œκΉ…, λ˜λŠ” μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ³Έ μ»€λ§¨λ“œ νŒ¨ν„΄

  1. λ°œλ™μž(Invoker) : μš”μ²­λ“€μ„ μ‹œμž‘ν•˜λŠ” 역할을 ν•˜λŠ” 클래슀둜, μˆ˜μ‹ μž λŒ€μ‹  μ»€λ§¨λ“œ 객체λ₯Ό μž‘λ™μ‹œν‚΄μœΌλ‘œμ¨ μš”μ²­ν•©λ‹ˆλ‹€. 또, μš”μ²­μ— λŒ€ν•œ 기둝을 남길 수 있고, ν•œ λ°œλ™μž 객체에 λ‹€μˆ˜μ˜ μ»€λ§¨λ“œ 객체가 전달될 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. Command Interface : 일반적으둜 μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 단일 λ©”μ„œλ“œλ§Œμ„ μ„ μ–Έν•©λ‹ˆλ‹€.
  3. Concrete Command : λ‹€μ–‘ν•œ μœ ν˜•μ˜ μš”μ²­μ„ κ΅¬ν˜„. 자체적으둜 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œλŠ” μ•ˆ 되며, λŒ€μ‹  μˆ˜μ‹ μžμ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μˆ˜μ‹  κ°μ²΄μ—μ„œ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ 맀개 λ³€μˆ˜λ“€μ€ ꡬ상 μ»€λ§¨λ“œμ˜ ν•„λ“œλ“€λ‘œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œλ§Œ μ΄λŸ¬ν•œ ν•„λ“œλ“€μ˜ μ΄ˆκΈ°ν™”λ₯Ό ν—ˆμš©ν•¨μœΌλ‘œμ¨ μ»€λ§¨λ“œ 객체듀을 λΆˆλ³€μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. μˆ˜μ‹ μž(Receiver) : 일뢀 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 ν¬ν•¨λ˜μ–΄ 있으며, μ»€λ§¨λ“œ 객체가 μˆ˜μ‹ μžμ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μ»€λ§¨λ“œλ“€μ€ μš”μ²­μ΄ μˆ˜μ‹ μžμ—κ²Œ μ „λ‹¬λ˜λŠ” 방법에 λŒ€ν•œ μ„ΈλΆ€ μ •λ³΄λ§Œ μ²˜λ¦¬ν•˜λŠ” 반면 μˆ˜μ‹ μž μžμ²΄λŠ” μ‹€μ œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  5. 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();
    }
}

 

πŸ’‘ 마무리

μ»€λ§¨λ“œ νŒ¨ν„΄μ€

  1. μž‘μ—…μ„ κ°μ²΄ν™”ν•˜μ—¬ λ§€κ°œλ³€μˆ˜ν™”ν•˜κ³  싢을 λ•Œ
  2. μž‘μ—…λ“€μ˜ 싀행을 μ˜ˆμ•½ ν˜Ήμ€ μ›κ²©μœΌλ‘œ μ‹€ν–‰ν•˜κ³  싢을 λ•Œ
  3. 되돌릴 수 μžˆλŠ” μž‘μ—…μ„ κ΅¬ν˜„ν•˜κ³  싢을 λ•Œ

에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ»€λ§¨λ“œ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μž‘μ—…μ„ ν˜ΈμΆœν•˜λŠ” ν΄λž˜μŠ€λ“€μ„ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν΄λž˜μŠ€λ“€λ‘œλΆ€ν„° 뢄리할 수 있고(SRP μ€€μˆ˜), κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒˆ μ»€λ§¨λ“œλ₯Ό λ„μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.(OCP μ€€μˆ˜)

 

 

μ»€λ§¨λ“œ νŒ¨ν„΄

/ λ””μžμΈ νŒ¨ν„΄λ“€ / 행동 νŒ¨ν„΄ μ»€λ§¨λ“œ νŒ¨ν„΄ λ‹€μŒ μ΄λ¦„μœΌλ‘œλ„ λΆˆλ¦½λ‹ˆλ‹€: μ•‘μ…˜, νŠΈλžœμž­μ…˜, Command μ˜λ„ μ»€λ§¨λ“œλŠ” μš”μ²­μ„ μš”μ²­μ— λŒ€ν•œ λͺ¨λ“  정보가 ν¬ν•¨λœ λ…λ¦½μ‹€ν–‰ν˜• 객체둜 λ³€ν™˜ν•˜λŠ” 행동 λ””μžμΈ

refactoring.guru

 

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ’‘ DEEP DIVE/PATTERN' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • Deep Dive Into Design Patterns - λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μ „λž΅ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μƒνƒœ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄
    6_oHji
    6_oHji
    끄적끄적

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”