배고픈 개발자 이야기

2.커맨드 (Command) 패턴 본문

전산학/디자인패턴

2.커맨드 (Command) 패턴

이융희 2019. 9. 14. 14:19
728x90

커맨드 패턴이란 요청을 객체의 형태로 캡슐화 하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴이다.

 

커맨드 패턴에는 명령(command), 수신자(receiver), 발동자(invoker), 클라이언트(client)의 네개의 용어가 항상 따른다. 커맨드 객체는 수신자 객체를 가지고 있으며, 수신자의 메서드를 호출하고, 이에 수신자는 자신에게 정의된 메서드를 수행한다. 커맨드 객체는 별도로 발동자 객체에 전달되어 명령을 발동하게 한다. 발동자 객체는 필요에 따라 명령 발동에 대한 기록을 남길 수 있다. 한 발동자 객체에 다수의 커맨드 객체가 전달될 수 있다. 클라이언트 객체는 발동자 객체와 하나 이상의 커맨드 객체를 보유한다. 클라이언트 객체는 어느 시점에서 어떤 명령을 수행할지를 결정한다. 명령을 수행하려면, 클라이언트 객체는 발동자 객체로 커맨드 객체를 전달한다.

 

-테스트 코드

class Switch(object):
    """The INVOKER class"""
    def __init__(self, flip_up_cmd, flip_down_cmd):
        self.flip_up = flip_up_cmd 
        self.flip_down = flip_down_cmd 

class Light(object):
    """The RECEIVER class"""
    def turn_on(self):
        print("The light is on") # command "ON"일때 실행될 메소드
    def turn_off(self):
        print("The light is off") # command "OFF"일때 실행될 메소드

class TV(object):
    """The RECEIVER class"""
    def turn_on(self):
        print("The TV is on") # command "ON"일때 실행될 메소드
    def turn_off(self):
        print("The TV is off") # command "OFF"일때 실행될 메소드

class ButtonSwitch(object):
    """The CLIENT class"""
    def __init__(self):
        lamp = Light() # receiver 객체 생성
        button = TV()
        self._switch = Switch(lamp.turn_on, lamp.turn_off) # invoker 객체에 수행할 메소드 설정
        self.TV_switch = Switch(button.turn_on, button.turn_off)

    def switch(self, cmd):
        cmd = cmd.strip().upper() # 공백제거 및 대문자화
        if cmd == "LIGHTON":
            self._switch.flip_up() # command "ON"으로 설정된 메소드 실행
        elif cmd == "LIGHTOFF":
            self._switch.flip_down() # command "OFF"로 설정된 메소드 실행
        elif cmd == "TVON":
            self.TV_switch.flip_up()
        elif cmd == "TVOFF":
            self.TV_switch.flip_down()
        else:
            print("Argument 'ON' or 'OFF' is required.") # 잘못된 command 예외처리

# 파일이 모듈로 로딩되지 않고 스크립트로 실행될 때만 아래를 수행
if __name__ == "__main__":
    switch = ButtonSwitch() # Light 스위치 객체를 생성
    print("Light Switch ON test.")
    switch.switch("LIGHTON") # switch "on" command
    print("Light Switch OFF test.")
    switch.switch("LIGHTOFF") # switch "off" command
    print("Invalid Command test.")
    switch.switch("****")

    print("Switch ON test.")
    switch.switch("TVON") # switch "on" command
    print("Switch OFF test.")
    switch.switch("TVOFF") # switch "off" command
Comments