JAVA 객체지향
디자인패턴
2018.08.24
Chapter 09 옵서버 패턴
1. 여러 가지 방식으로 성적 출력하기
- 입력된 성적을 출력하는 프로그램
- ScoreRecord: 입력된 점수 저장
- DataSheetView : 점수를 목록 형태로 출력
1. 여러 가지 방식으로 성적 출력하기
- 입력된 성적을 출력하는 프로그램
- ScoreRecord: 입력된 점수 저장
- DataSheetView : 점수를 목록 형태로 출력

1. 여러 가지 방식으로 성적 출력하기
public class ScoreRecord {
private List<Integer> scores = new ArrayList<Integer>();
private DataSheetView dataSheetView;
public void setDataSheetView(DataSheetView dataSheetView) {
this.dataSheetView = dataSheetView;
}
public void addScore(int score) {
scores.add(score);
dataSheetView.update();
}
public List<Integer> getScoreRecord() {
return scores;
}
}
1. 여러 가지 방식으로 성적 출력하기
public class DataSheetView {
private ScoreRecord scoreRecord;
private int viewCount;
public DataSheetView(ScoreRecord scoreRecord, int viewCount) {
this.scoreRecord = scoreRecord;
this.viewCount = viewCount;
}
public void update() {
List<Integer> record = scoreRecord.getScoreRecord();
displayScores(record, viewCount);
}
private void displayScores(List<Integer> record, int viewCount) {
// 출력
}
}
2. 문제점
- 성적을 다른 형태로 출력
ex : 성적의 최소/최대 출력 - 여러 가지 형태의 성적을 출력
ex : 3, 5개 목록, 최소/최대 출력
2. 문제점
- 성적을 다른 형태로 출력
ex : 성적의 최소/최대 출력
public class ScoreRecord {
private List<Integer> scores = new ArrayList<Integer>();
private MinMaxView minMaxView;
public void setMinMaxView(MinMaxView minMaxView) {
this.minMaxView = minMaxView;
}
public void addScore(int score) {
scores.add(score);
minMaxView.update();
}
public List<Integer> getScoreRecord() {
return scores;
}
}
2. 문제점
- 성적을 다른 형태로 출력
ex : 성적의 최소/최대 출력
public class MinMaxView {
private ScoreRecord scoreRecord;
public MinMaxView(ScoreRecord scoreRecord) {
this.scoreRecord = scoreRecord;
}
public void update() {
List<Integer> record = scoreRecord.getScoreRecord();
displayMinMax(record);
}
private void displayMinMax(List<Integer> record) {
// 출력
}
}
2. 문제점
- 성적을 다른 형태로 출력
ex : 성적의 최소/최대 출력
- ScoreRecord 클래스에서 DataSheetView 대신 MinMaxView를 호출
2. 문제점
- 성적을 다른 형태로 출력
ex : 성적의 최소/최대 출력
- ScoreRecord 클래스에서 DataSheetView 대신 MinMaxView를 호출
OCP 위반
2. 문제점
- 여러 가지 형태의 성적을 출력
ex : 3, 5개 목록, 최소/최대 출력
2. 문제점
- ScoreRecord 클래스에서 DataSheetView2개, MinMaxView를 호출
OCP 위반
- 여러 가지 형태의 성적을 출력
ex : 3, 5개 목록, 최소/최대 출력
3. 해결책
- 성적 통보 대상이 변경되도 ScoreRecord 클래스는 재사용 가능해야한다.
- ScoreRecord 클래스에서 변화되는 부분을 식별하고 이를 일반화
3. 해결책

3. 해결책
public interface Observer {
public abstract void update();
}
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for(Observer o:observers)
o.update();
}
}
}
3. 해결책
public class ScoreRecord extends Subject {
private List<Integer> scores = new ArrayList<Integer>();
public void addScore(int score) {
scores.add(score);
notifyObservers();
}
public List<Integer> getScoreRecord() {
return scores;
}
}
public class DataSheetView implements Observer {
// ...
}
public class MinMaxView implements Observer {
// ...
}
4. 옵서버 패턴
데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않고 데이터 변경을 통보할 때 유용하다
4. 옵서버 패턴

- Observer - 데이터의 변경을 통보 받는 인터페이스
- Subject - ConcreteObserver 객체를 관리하는 요소
- ConcreteSubject - 변경 관리 대상이 되는 데이터가 있는 클래스
- ConcreteObserver - ConcreteSubject의 변경을 통보받는 클래스
JAVA 객체지향디자인패턴 - 옵서버 패턴
By Sungbin, Song
JAVA 객체지향디자인패턴 - 옵서버 패턴
- 150