2016-10-19 4 views
0

방금 ​​디자인 패턴을 배우기 시작합니다. 하나는 명령 패턴입니다.레스토랑 사용 사례의 명령어 패턴

http://www.oodesign.com/command-pattern.html https://www.tutorialspoint.com/design_pattern/command_pattern.htm

일부 재료와 약간의 문서화 등을 읽은 후 나는 재고 구매 및 판매에 대한 명령 패턴을 사용하는 아이디어를 얻었다. 클라이언트는 먼저 자신이 판매 또는 구매하고 싶은 주식을 결정한 다음 에이전트/브로커가 명령의 실행 기능을 호출하게 할 수 있습니다. 나는 이것이 합리적이라고 생각한다.

또 다른 '고전적인'예는 레스토랑이기 때문에 꽤 오랫동안 나를 혼란스럽게합니다. 고객 인 경우 고객은 어떤 요리사 (수령인)가 품목을 요리 할 수 ​​있는지 (예에서는 스프 또는 그릴)를 어떻게 알 수 있습니까? 내가 생각하는 고객이 요리사를 결정하지 않아야한다. 누구든지이 생각에 어떻게 접근해야하는지 지적 할 수 있습니까?

감사합니다.

답변

1

나는 당신이 레스토랑의 예를 올바르게 생각하지 않는다고 생각합니다. 고객은 요리사에게 직접 주문하지 않으며, 웨이트리스는 주문을 주방으로 가져 와서 요리사가 주문할 수있는 대기열에 넣습니다.

코드에서 이것은 웨이트리스가 추가하는 공유 대기열처럼 보일 것이고 요리사는 요리를 할 수있는 다음 순서로 무언가를 요리하는 연속 루프에 있습니다. 이 예제의 명령 패턴은 단순히 고객에서 주방으로 전송되는 순서입니다.

+0

답장을 보내 주셔서 감사합니다! 그런 다음이 예에서 구체적인 명령 (주문)은 주문을 준비 할 수있는 요리사 개체에 대한 참조를 갖고 있습니까?있다면 구체적인 명령이 인스턴스화 될 때 (고객/클라이언트가?) 우리는 인스턴스화를 위해 Cook 객체를 가져야합니다. 맞습니까? – Lubor

+0

이 예제의 순서는 전달 된 객체 일뿐입니다. 그것이 요리사에게가는 방법은 메시지 통행인,이 경우에는 웨이트리스 및/또는 주문을 보관하는 랙을 통과하는 것입니다. – Lorenzo

1

실제로 질문은 명령 패턴이 실제로 해결하려고하는 문제의 범위를 벗어납니다.

Java에 익숙하다면 Command Java 스레드의 패턴을 쉽게 알 수 있습니다. 실제로 Thread.run() (run()뿐 아니라)은 간단히 명령 패턴입니다.

주요 개념은 중요한 기능을 가진 개체 그룹 (Command 인터페이스를 확장하는 구체적인 Command 개체)이있는 경우 메서드 매개 변수 또는 형식이 엄격하지 않은 메서드로 구현하는 것입니다. 따라서 해당 기능을 실행하고자하는 모든 호출자 (CommandHandler)가 구체적인 클래스가 무엇인지 모른 채 실제로 실행할 수 있습니다. someCommandObject.execute();을 실행할 수 있습니다. 명령 인터페이스의 인스턴스만이 필요합니다.

자바 스레드 예제에서 JVM/운영 체제에 대해 생각해 봅시다. 어떤 프로그램도 실행중인 프로그램이 스레드의 프로세스로있는 스레드로 그 수준으로갑니다. 그 스레드가 실행 프로그램 anyThread.start() 의한 스레드의 처리를 수행 할 수 있도록, 레스토랑 등의 예에서

anyThread.sleep() 실제 커맨드 객체는 CommandHandler가 Waiter이다 SoupOrder, GrillOrder 등이다. LunchOrder이라는 하위 명령 객체 인 Command 클래스를 소개하고 void execute(){}을 구현하는 상황을 생각해보십시오. 이제는 호출자 (Waiter)를 변경하지 않아도 계속 lunchOrder.execute()을 호출 할 수 있습니다. 따라서 게시자 (명령 객체)와 클라이언트 (호출자) 구현은 분리됩니다. 그것이 커맨드 패턴의 아름다움입니다.

this을 참조 할 수도 있습니다. :))

관련 문제