티스토리 뷰
옵저버 패턴을 살펴 보다가 어떤식으로 활용 할 수 있을 지 고민 해 보았다.
노트 어플리케이션을 예로 들어보자.
텍스트노트와 그림노트를 추가 할 수 있으며
새로운 노트가 생성 될 때마다 갱신되어 최신 기준으로 정렬 된다.
텍스트 노트는 타이틀이 없을 경우 자동으로 타이틀과 썸네일을 만들어 준다.
그림 노트는 썸네일만 만들어 준다.
옵저버 패턴으로 구현 한다면 충분히 만들 수 있을 거 같다.
1. 먼저 Note 인터페이스를 만들자
이 인터페이스는 노트가 추가되거나 수정 삭제 되었을 때 전달을 받아서 update를 실행 할 수 있다.
Note.java
public Interface Note() {
update();
}
2. TextNote와 PictureNote 객체를 만들자.
- Note 인터페이스를 상속받아서 노티가 왔을 때 update를 실행 할 수 있도록 하자.
- update를 실행 했을 때 수행 할 것은 따로 인터페이스로 만들자.(TextNote 는 정렬과 타이틀 생성과 썸네일 생성, PictureNote는 썸네일 생성 이 필요하다.)
- 정렬을 위한 인터페이스 Sort 와 타이틀 생성 썸네일 생성을 위한 인터페이스 Deco 를 만들어 상속 받는다.
public interface Sort {
sort(); //정렬
}
public interface DecoTitle {
makeTitle(); //타이틀 만들기
}
public interface DecoThumnail {
makeThumnail(); //썸네일 만들기
}
TextNote.java
public class TextNote implements Note, Sort, DecoTitle, DecoThumnail {
update() {
sort();
makeTitle();
makeThumnail();
}
@Override
public void sort() {
//정렬 코드
}
@Override
public void makeTitle() {
//타이틀 만들기 코드
}
@Override
public void makeThumnail() {
//썸네일 만들기 코드
}
}
PictureNote.java
public class PictureNote implements Note, Sort, DecoThumnail {
update() {
sort();
makeTitle();
makeThumnail();
}
@Override
public void sort() {
//정렬 코드
}
@Override
public void makeThumnail() {
//썸네일 만들기 코드
}
}
3. 전체 노트를 관리하는 NoteManager 객체를 만들자.
인제 이 노트들이 변화가 있을때 모든 노트들에게 update를 호출하도록 하는 걸 만들어 보자.
이름은 NoteManager 라고 부르자.
아래와 같은 기능이 필요하다.
- 노트가 처음 생성 될 때마다 List에 넣어서 관리 한다.
- 노트가 삭제되면 List에서 삭제한다.
- 노트에 변경(생성, 수정, 삭제)이 일어나면 List 안에 있는 노트들의 update를 호출한다.
NoteManager.java
public class NoteManager {
List<Note> noteList = new ArrayList();
registNote(Note note) {
noteList.add(note);
updateAll();
}
unregistNote(Note note) {
noteList.remove(note);
updateAll();
}
modifyNote(Note note) {
updateAll();
}
updateall() {
for(Note note: noteList) {
note.update();
}
}
}