JAVA 21일차 (2023-06-21) 자바 기초 DAY19_Command 패턴을 활용하여 메뉴 기능 구현하기_개인프로젝트 - 마트 관리 시스템
## 23. Composite, Command, Observer 디자인 패턴, 추상 클래스/메서드 활용하기
- Command 패턴을 활용하여 메뉴 기능 구현하기
- BoardHandler, MemberHandler에 적용
- ActionListener 인터페이스 활용
- BoardXxxListener, MemberXxxListener 클래스로 분해

Command 패턴을 활용하여 메뉴 기능 구현하기
ㄴ BoardHandler 에 적용
ㄴActionListener 인터페이스 활용
ㄴ BoardXxxListener 클래스로 분해
BoardAddListener 생성
BoardAddListener.java

=>

ㄴ BoardAddListener 라는 이름으로 BoardHandler 를 복사
ㄴ Handler -> ActionListener 로 변경
BoardAddListener.java

=>
BoardAddListener.java

ㄴ BoardAddListener 클래스에서 List 를 제외하고 모두 제거
BoardAddListener.java

=>

ㄴ execute() -> service()
ㄴ BreadcrumbPrompt 를 파라미터로 추가
BoardAddListener.java






ㄴ 선택 코드 제거
BoardAddListener.java

ㄴ 해당 코드를 service(BreadcrumbPrompt prompt) 메서드로 이동
=>

ㄴ BoardAddListener 클래스 내부에 prompt 멤버 변수가 정의되어 있지 않기 때문에 prompt 앞에 this 는 모두 제거
(외부에서 받아오는 prompt 사용)
=>
BoardAddListener.java

ㄴ BoardAddListener 완성 코드
BoardListListener 생성
BoardListListener.java

ㄴ BoardAddListener 라는 이름으로 BoardHandler 를 복사
ㄴ Handler -> ActionListener 로 변경
ㄴ ActionListener 인터페이스 import 해주기
BoardListListener.java

ㄴ BoardListListener 클래스에서 List 를 제외하고 모두 제거
BoardListListener.java

ㄴ execute() -> service()
ㄴ BreadcrumbPrompt 를 파라미터로 추가
BoardListListener.java

ㄴ printBoards 메서드를 제외한 나머지 모두 제거
ㄴ 해당 코드를 service(BreadcrumbPrompt prompt) 메서드로 이동
BoardListListener.java

ㄴ BoardListListener 완성 코드
BoardDetailListener 생성
BoardDetailList.java

ㄴ BoardDetailListener 라는 이름으로 BoardHandler 를 복사
ㄴ Handler -> ActionListener 로 변경
ㄴ ActionListener 인터페이스 import 해주기 (Ctrl + Shift + O)
BoardDetailListener.java

ㄴ BoardDetailListener 클래스에서 List 를 제외하고 모두 제거
BoardDetailListener.java

ㄴ execute() -> service()
ㄴ BreadcrumbPrompt 를 파라미터로 추가
BoardDetailListener.java

ㄴ viewBoard(), findBy() 메서드를 제외한 나머지 모두 제거 (findBy()메서드는 viewBoard() 메서드 안에서 사용하므로 제거하지 않음)
ㄴ 해당 코드를 service(BreadcrumbPrompt prompt) 메서드로 이동
BoardDetailListener.java

ㄴ BoardDetailListener 클래스 내부에 prompt 멤버 변수가 정의되어 있지 않기 때문에 prompt 앞에 this 는 모두 제거
(외부에서 받아오는 prompt 사용)
BoardDetailListener.java


ㄴ BoardDetailListener 완성 코드
BoardUpdateListener 생성
BoardUpdateList.java
ㄴ BoardHandler 를 BoardUpdateListener 라는 이름으로 복사
BoardUpdateList.java

ㄴ Handler -> ActionListener 로 변경
ㄴ ActionListener 인터페이스 import 해주기 (Ctrl + Shift + O)
BoardUpdateListener.java

ㄴ BoardUpdateListener 클래스에서 List 를 제외하고 모두 제거
BoardUpdateListener.java

ㄴ execute() -> service()
ㄴ BreadcrumbPrompt 를 파라미터로 추가
BoardUpdateListener.java

ㄴ UpdateBoard(), findBy() 메서드를 제외한 나머지 모두 제거 (findBy()메서드는 UpdateBoard() 메서드 안에서 사용하므로 제거하지 않음)
ㄴ 해당 코드를 service(BreadcrumbPrompt prompt) 메서드로 이동
BoardUpdateListener.java

ㄴ BoardUpdateListener 클래스 내부에 prompt 멤버 변수가 정의되어 있지 않기 때문에 prompt 앞에 this 는 모두 제거
(외부에서 받아오는 prompt 사용)
BoardDetailListener.java


ㄴ BoardDetailListener 완성 코드
BoardDeleteListener 생성
BoardDeleteList.java



ㄴ BoardHandler 자체를 BoardDeleteListener 라는 이름으로 변경(Refactor 이용)
BoardDeleteList.java

ㄴ Handler -> ActionListener 로 변경
ㄴ ActionListener 인터페이스 import 해주기 (Ctrl + Shift + O)
BoardDetailListener.java

ㄴ BoardDeleteListener 클래스에서 List 를 제외하고 모두 제거
BoardDeleteListener.java

ㄴ execute() -> service()
ㄴ BreadcrumbPrompt 를 파라미터로 추가
BoardDeleteListener.java

ㄴ viewBoard() 메서드를 제외한 나머지 모두 제거
ㄴ 해당 코드를 service(BreadcrumbPrompt prompt) 메서드로 이동
BoardDeleteListener.java

ㄴ BoardDetailListener 클래스 내부에 prompt 멤버 변수가 정의되어 있지 않기 때문에 prompt 앞에 this 는 모두 제거
(외부에서 받아오는 prompt 사용)
BoardDeleteListener.java

ㄴ BoardDeleteListener 완성 코드
Command 패턴을 활용하여 메뉴 기능 구현하기
ㄴ MemberHandler 에 적용
ㄴActionListener 인터페이스 활용
ㄴ MemberXxxListener 클래스로 분해
=> Board 와 같은 방법으로 구현
Command 패턴을 활용하여 메뉴 기능 구현하기
ㄴ ItemHandler 에 적용
ㄴActionListener 인터페이스 활용
ㄴ ItemXxxListener 클래스로 분해
=> Board 와 같은 방법으로 구현
Menu 클래스와 App 클래스 수정
Menu.java

ㄴ this.addActionListener(listener); => 생성자로 전달된 ActionListener 객체를 현재 Menu 객체에 등록
Menu.java

ㄴ this(title); => 위에 있는 첫 번째 생성자 ( Menu(String title) )를 호출하여 title 값을 초기화
=> 생성자에서 생성자를 호출함
App.java

ㄴ boardList, noticeList 는 변경, 삭제가 많이 이루어지므로 LinkedList 로 선언
ㄴ memberList, itemList 는 조회가 많이 이루어지므로 ArrayList 로 선언
App.java

ㄴ Menu 클래스에 추가한 생성자 Menu(String title, ActionListener listener) {...} 에서 ActionListener 파라미터에 각각 new BoardAddListener(boardList), new BoardListListener(boardList), new BoardDetailListener(boardList), new BoardUpdateListener(boardList), new BoardDeleteListener(boardList) 를 넣어줌
=> MemberMenu, ItemMenu, NoticeMenu 도 같은 방법으로 수정


