2018.08.24
Chapter 09 옵서버 패턴
1. 여러 가지 방식으로 성적 출력하기
1. 여러 가지 방식으로 성적 출력하기
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. 문제점
2. 문제점
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. 문제점
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. 문제점
2. 문제점
OCP 위반
2. 문제점
2. 문제점
OCP 위반
3. 해결책
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. 옵서버 패턴