[python] 커맨드 패턴
커맨드 패턴은 객체 지향 디자인 패턴 중 하나로, 요청을 객체로 캡슐화하여 요청을 매개 변수로 전달하고, 실행될 메소드를 지정하여 요청의 발신측과 수신측을 분리합니다. 이런 방식으로 유연한 실행과 이력 추적, 취소 등의 기능을 제공합니다.
이 패턴은 다양한 상황에서 사용 가능하며, 특히 다음과 같은 경우에 유용합니다:
- 요청이 발생한 시점에 요청을 처리할 객체를 알 수 없을 때
- 요청을 큐에 저장하거나, 로깅, 취소, 재사용 등의 추가 기능이 필요할 때
- 상호작용을 위한 요청의 발신측과 수신측을 분리해야 할 때
커맨드 패턴의 구조
커맨드 패턴은 다음과 같은 주요 구성요소로 이루어져 있습니다:
- Command (Command 인터페이스): 실행될 메소드를 선언하는 인터페이스입니다.
- ConcreteCommand (Command 인터페이스를 구현하는 클래스): Command 인터페이스를 구현하고, 요청을 수신할 Receiver 객체를 갖습니다.
- Receiver: 실제로 요청을 처리하는 객체입니다.
- Invoker: 요청을 보내는 객체입니다. 해당 객체는 실행될 메소드와 수신자(Receiver)를 알지 못합니다.
- Client: Invoker 객체를 생성하고, 특정 ConcreteCommand 객체를 설정하여 요청을 보냅니다.
파이썬에서의 커맨드 패턴 구현
파이썬에서는 커맨드 패턴을 간단하게 구현할 수 있습니다. 아래는 간단한 예제 코드입니다:
from abc import ABC, abstractmethod
class Command(ABC):
@abstractmethod
def execute(self):
pass
class ConcreteCommand(Command):
def __init__(self, receiver):
self.receiver = receiver
def execute(self):
self.receiver.action()
class Receiver:
def action(self):
print("실제로 요청을 처리하는 객체의 동작을 수행합니다.")
class Invoker:
def __init__(self):
self.command = None
def set_command(self, command):
self.command = command
def execute_command(self):
self.command.execute()
if __name__ == "__main__":
receiver = Receiver()
command = ConcreteCommand(receiver)
invoker = Invoker()
invoker.set_command(command)
invoker.execute_command()
위의 예제 코드는 커맨드 패턴을 파이썬으로 구현한 것으로, Receiver 클래스에서 실제 요청을 처리하는 로직이 작성되고, Invoker 클래스에서는 해당 요청을 전달하고 실행하는 역할을 합니다. Client는 Receiver 객체와 ConcreteCommand 객체를 생성하여 요청을 보내게 됩니다.
이를 통해 요청의 수신측과 발신측을 분리하고, 유연한 기능 확장과 이력 추적, 취소 등을 구현할 수 있습니다.