작심삼일

9주차-2. Command 본문

스터디/디자인 패턴

9주차-2. Command

yun_s 2021. 7. 21. 21:51
728x90
반응형

디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.

틀린 부분은 알려주시면 감사하겠습니다.

어떤 패턴인가

요청 자체를 캡슐화하는 것입니다.

이를 통해 요청이 서로 다른 사용자를 매개변수로 만들고, 요청을 대기시키거나 로깅하며, 되돌릴 수 있는 연산을 지원합니다.

이미 구현된 기능을 사용하는 것이기 때문에 의존성이 없지만, 모든 기능을 구현해야한다는 단점이 있다.


어떻게 쓰는가

Command: 연산 수행에 필요한 인터페이스를 선언합니다.

ConcreteCommand: Receiver 객체와 액션 간의 연결성을 정의합니다.

Client: ConcreteCommand 객체를 생성하고 처리 객체로 정의합니다.

Invoker: 명령어에 처리를 수행할 것을 요청합니다.

Receiver: 요청에 관련된 연산 수행 방법을 알고 있습니다.

# Receiver
class Light:
    def on(self):
        print("Light On")

    def off(self):
        print("Light Off")

# Command
class Command:
    def execute(self):
        pass

    def undo(self):
        pass

# Concrete Command
class LightOnCommand(Command):
    def __init__(self, light):
        self.light = light

    def execute(self):
        self.light.on()

    def undo(self):
        self.light.off()

# Invoker
class SimpleRemoteControl:
    def SetCommand(self, command):
        self.slot = command

    def ButtonPressed(self):
        self.slot.execute()

--------------------------------------------------------------------------
controller = SimpleRemoteControl()
controller.SetCommand(LightOnCommand(Light()))
controller.ButtonPressed()

어디서 활용되는가

이는 책의 내용 (p. 314)을 그대로 가져왔다.

1. 수행할 동작을 객체로 매개변수화하고자 할 때

2. 서로 다른 시간에 요청을 명시하고, 저장하며, 실행하고 싶을 때

3. 실행 취소 기능을 지원하고 싶을 때

4. 시스템이 고장 났을 때 재적용이 가능하도록 변경 과정에 대한 로깅을 지원하고 싶을 때


My Opinion

각 기능을 객체로 만든다고 생각하면 그 개념이 어렵진 않다.

기능을 구현해야하는 경우는 리모컨 등 다양한 경우에서 사용되겠지만, 내가 당장 활용할 수 있는 부분은 떠오르지 않는다.

728x90
반응형

'스터디 > 디자인 패턴' 카테고리의 다른 글

11주차. Builder  (0) 2021.08.11
10주차. Memento  (0) 2021.07.28
9주차-1. Composite  (0) 2021.07.21
8주차-2. Iterator  (0) 2021.07.08
8주차-1. Chain of responsibility  (0) 2021.07.08
Comments