티스토리 뷰

Tip and Error/ETC

디자인 패턴 - Command

geonwoopaeng@gmail.com 2020. 8. 24. 17:02

### Command 디자인 패턴 ###

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

(출처: 위키백과)

 

=> Command를 하나의 클래스로 만들어서 캡슐화 하는 패턴

 

< 특징 >

: 요구사항을 객체로 캡슐화 할 수 있고 매개변수를 써서 여러 가지 다른 요구사항을 추가 할 수 있다.

: 사용자의 요청을 객체화하고 해당 객체만 있으면 해당 command가 어떤 작업을 수행했는지 알 수 있다.

: Command 객체는 일련의 행동을 특정 receiver하고 연결하여 요구사항을 캡슐화 한다.

 

 

< 용어 정리 >

Client: Command 객체를 생성, Invoker를 통해 Receiver에게 행동을 전달

 

Invoker: Client에게 명령을 받아서 Command 인터페이스 연결

 

Command: Receiver을 어떻게 실행 할지 연결(클래스 행동 + Receiver 정보)

 

Receiver: 행동하는 객체(명령 수행), Command 객체로부터 특정 행동 요청 받음

 

 

< 구조 >

(출처: 위키백과)

 

### 예제 ###

< 목표 >

: 인쇄 관리 프로그램 개발

 

 

< 요구사항 >

: 문서 프로그램이나 이미지 관리 프로그램에서 인쇄를 요청을 하면 그 요청을 받아 지정된 프린터기로 인쇄 페이지를 전달하는 프로그램이다. 인쇄관리 프로그램은 여러 인쇄페이지가 있을 경우 한 번에 한 페이지씩 프린터기로 전송해야 한다. 사용자가 지정한 프린터기를 통해 인쇄되어야 한다.

 

 

< 시스템 과정 >

1. 문서/이미지 관리 프로그램이 인쇄 요청(인쇄 페이지)을 인쇄 관리 프로그램에 전달

2. 인쇄 관리 프로그램은 인쇄 페이지를 프린터기에 전달

(조건: 한 번에 한 페이지씩 전송)

3. 프린터는 전달 받은 대로 프린터 실행

(조건: 특정 프린터기 선택)

 

 

< 인쇄관리 프로그램 표 Command 패턴 >

인쇄 관리 프로그램 Command 패턴

문서/이미지 관리 프로그램

(Program)

Client

인쇄 관리 프로그램

(Copy_control_program)

Invoker
인쇄을 하는 것 setCommand()

인쇄를 요청하는 것

(Copy_request)

Command 객체

인쇄 페이지를 프린터기에 전달하여

프린터를 요청하는 것

+

한 번에 한 page씩 전송(조건)

Execute()
특정 프린터기 선택 Select_printer()

프린터

(Printer)

Receiver

 

 

< 구조 >

 

 

# Program 에서 page를 만들어서 Copy_control_program로 page를 보내서 검사하여 Printer에서 복사하는 과정입니다.
class Printer(object):
    def __init__(self,check_page):
        self.check_page = check_page
    #Receiver
    def print_copy(self):
        print("{} 프린터 하였습니다.".format(self.check_page))

class Copy_control_program(Printer): 
    # Invoker 
    def __init__(self, p_page): #page: 프린터 할 page
        self._p_page = p_page

    def Select_printer(self): #여러 프린터중 1개를 선택하는 과정
        print("프린터를 선택했습니다.")

    def Execute(self): #page가 1개인지 check하는 과정
        if (self._p_page == 1):
            self.Select_printer()
            Printer(self._p_page).print_copy()
        else:
            print("여러 page가 들어갔습니다.")
    
class Program(object):
    #Client 
    def __init__(self,page_cmd):
        self.page_cmd = page_cmd
        program = Copy_control_program(self.page_cmd)
        program.Execute()
        
if __name__ == "__main__":
    print("<여러개 들어갔을 때>")
    program_page = Program(2)
    print("<1개 들어갔을 때>")
    program_page2 = Program(1)

자료.hwp
0.18MB

반응형

'Tip and Error > ETC' 카테고리의 다른 글

1. Basic  (0) 2021.03.01
class & id & name 속성  (0) 2020.10.07
(3) templates 짜기(window) => 기본 연결 base 만들기  (0) 2020.09.16
(2) db 생성 & Django adminstration 실행(window)  (0) 2020.09.16
(1) 프로젝트 설정(window)  (0) 2020.09.16
공지사항
최근에 올라온 글