함수를 인수로 전달하는 기법을 사용하면 명령 디자인 패턴도 구현을 단순하게 만들 수 있다.
명령 패턴의 목적은 연산을 실행하는 객체(호출자)의 연산을 구현하는 객체(수신자)를 분리하는 것으로 그래픽 애플리케이션의 메뉴 항목이 호출자며, 편집되고 있는 문서나 애플리케이션 자신이 수신자다.
이를 통해, 호출자는 수신자의 인터페이스를 알 필요가 없고, 명령의ㅣ 서브클래스를 통해 서로 다른 수신자를 추가할 수 있다.
호출자는 구체적인 명령으로 설정되며, 연산을 실행하기 위해 execute() 메서드를 호출하므로 MacroCommand 명령 객체는 일련의 명령을 저장할 수 있기에 execute()메서드는 저장된 각 명령의 execute() 메서드를 호출한다.
호출자에 Command 객체 대신 간단히 함수로 바로 지정이 가능하므로 command.execute()를 호출하는 대신, 호출자는 단지 command()를 호출하면 되고, MacroCommand는 call()메서드를 가진 클래스로 구현할 수 있다.
MacroCommand의 객체는 콜러블이 되며, 향후에 호출한 함수들의 리스트를 가진다.
#각각의 MacroCommand 객체는 내부에 영향 리스트를 갖고 있다.
class MacroCommand:
"""명령 리스트를 실행하는 명령"""
def __init__(self, commands):
self.commands = list(commands)
def __call__(self):
for command in self.commands:
command()
"""
실행 취소 지원 등 고급 기능의 명령 패턴을 구현하려면 단순한 콜백 함수로는 어려울 수 있고, 파이썬에선 다음과 같은 두 가지 대안을 제시한다.
MacroCommand와 같은 콜러블 객체는 필요한 상태를 보관함으로써 __call__() 메서드 이외의 메서드로 제공할 수 있다.
함수가 호출된 후의 상태를 내부에 보관하기 위해 클로저를 사용할 수 있다.
"""