[파이썬] 커맨드 패턴과 요청 객체

커맨드 패턴은 소프트웨어 디자인 패턴 중 하나로, 실행 가능한 코드를 캡슐화하여 추상화된 객체로 사용하는 방식입니다. 이 패턴은 기능을 부여하거나 작업을 수행하기 위해 요청을 객체의 형태로 캡슐화합니다. 이를 통해 요청을 수신하는 개체는 요청을 수행하는 객체에 대해 알 수 없으며, 단지 요청을 수행하기 위한 적절한 커맨드 객체에 의존할 뿐입니다.

커맨드 패턴은 많은 이점을 제공합니다. 첫째, 다양한 작업을 수행하는 객체들 간의 강한 결합을 방지할 수 있습니다. 둘째, 새로운 커맨드를 간단히 추가하거나 수정할 수 있습니다. 셋째, 실행 취소 및 다시 실행과 같은 추가 기능을 구현할 수 있습니다.

요청 객체 (Request Objects)

커맨드 패턴을 사용할 때, 주로 요청 객체를 사용합니다. 요청 객체는 실행될 작업 또는 함수를 나타내는 속성을 가지고 있습니다. 이 속성은 일반적으로 execute 라는 메서드를 포함하는 인터페이스를 구현한 객체입니다.

파이썬에서는 다음과 같이 요청 객체를 정의할 수 있습니다:

class Request:
    def execute(self):
        pass

이제 여러 가지 작업을 수행하는 구체적인 요청 객체를 만들 수 있습니다.

실행 가능한 작업을 나타내는 요청 객체 만들기

class HelloWorldRequest(Request):
    def execute(self):
        print("Hello, World!")

class GreetRequest(Request):
    def __init__(self, name):
        self.name = name

    def execute(self):
        print(f"Hello, {self.name}!")

위의 예제에서 HelloWorldRequest는 execute 메서드를 구현하여 “Hello, World!”를 출력합니다. GreetRequest는 초기화될 때 이름을 인수로 받아 execute 메서드에서 해당 이름을 사용하여 인사를 출력합니다.

커맨드 객체 (Command Objects)

커맨드 객체는 요청을 수행하는 객체입니다. 커맨드 객체는 요청 객체를 인스턴스화하고, 해당 요청 객체를 실행할 수 있는 execute 메서드를 가지고 있습니다.

class Command:
    def __init__(self, request):
        self.request = request

    def execute(self):
        self.request.execute()

위의 예시에서 Command 클래스는 요청 객체를 인수로 받아 초기화하여 해당 요청을 실행하는 execute 메서드를 제공합니다.

이제 커맨드 객체를 사용하여 요청을 수행할 수 있습니다.

hello = HelloWorldRequest()
greet = GreetRequest("John")

hello_command = Command(hello)
greet_command = Command(greet)

hello_command.execute()  # Output: Hello, World!
greet_command.execute()  # Output: Hello, John!

위의 예시에서 hello 객체와 greet 객체는 각각 HelloWorldRequest 및 GreetRequest에 대한 인스턴스입니다. 이러한 요청 객체를 사용하여 Command 인스턴스를 생성하고 execute 메서드를 호출하여 요청을 수행할 수 있습니다.

커맨드 패턴을 사용하면 코드를 보다 모듈화하고 유연하게 만들 수 있습니다. 요청을 캡슐화하고 실행 가능한 객체로 사용함으로써 기능의 확장과 변경이 용이해집니다.

위에 제시된 예제는 단순한 시작일 뿐, 더 복잡한 시나리오에서 커맨드 패턴을 사용하여 유지보수 가능한 소프트웨어를 구축할 수 있습니다. 이 패턴을 통해 코드의 직접적인 결합을 피하고, 각각의 기능을 독립적으로 관리할 수 있는 이점을 누릴 수 있습니다.