## 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 도 같은 방법으로 수정