티스토리 뷰

옵저버 패턴을 살펴 보다가 어떤식으로 활용 할 수 있을 지 고민 해 보았다.

 

노트 어플리케이션을 예로 들어보자.

 

텍스트노트와 그림노트를 추가 할 수 있으며

 

새로운 노트가 생성 될 때마다 갱신되어 최신 기준으로 정렬 된다.

 

텍스트 노트는 타이틀이 없을 경우 자동으로 타이틀과 썸네일을 만들어 준다.

그림 노트는 썸네일만 만들어 준다.

 

옵저버 패턴으로 구현 한다면 충분히 만들 수 있을 거 같다.

 

 

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();

        }

    }

}

 

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday