Observer.class
public interface Observer {
void update();
}
Subject.class
public abstract class Subject {
// 추상화된 통보 대상 목록 (즉, 출력 형태에 대한 Observer)
private List<Observer> observers = new ArrayList<Observer>();
// 통보 대상(Observer) 추가
public void attach(Observer observer) { observers.add(observer);}
// 통보 대상(Observer) 제거
public void detach(Observer observer) { observers.remove(observer);}
// 각 통보 대상(Observer)에 변경을 통보. (List<Observer>객체들의 update를 호출)
public void notifyObservers() {
for (Observer o : observers) {
o.update();
}
}
}
ScoreRecord.class
/* 구체적인 변경 감시 대상 데이터 */
// 출력형태 2개를 가질 때
public class ScoreRecord extends Subject{
private List<Integer> scores = new ArrayList<>(); // 점수를 저장함
// 새로운 점수를 추가 (상태 변경)
public void addScore(int score) {
scores.add(score); // scores 목록에 주어진 점수를 추가함
notifyObservers(); // scores가 변경됨을 각 통보 대상(Observer)에게 통보함
}
public List<Integer> getScoreRecord() { return scores; }
}
notifyObservers()
를 통해 통보 대상들에게 알림을 보낸다DataSheetView.class
/* 1. 출력형태: 목록 형태로 출력하는 클래스 */
public class DataSheetView implements Observer{
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); // 조회된 점수를 viewCount 만큼만 출력함
}
private void displayScores(List<Integer> record, int viewCount) {
System.out.println("List of " + viewCount + " entries: ");
for (int i = 0; i < viewCount && i < record.size(); i++) {
System.out.println(record.get(i) + " ");
}
System.out.println();
}
}
update()
을 통해 통보를 받아 성적을 출력한다.MinMaxView.class
/* 2. 출력형태: 최소/최대 값만을 출력하는 형태의 클래스 */
public class MinMaxView implements Observer{
private ScoreRecord scoreRecord;
// getScoreRecord()를 호출하기 위해 ScoreRecord 객체를 인자로 받음
public MinMaxView(ScoreRecord scoreRecord) {
this.scoreRecord = scoreRecord;
}
// 점수의 변경을 통보받음
public void update() {
List<Integer> record = scoreRecord.getScoreRecord(); // 점수를 조회함
displayScores(record); // 최소값과 최대값을 출력함
}
// 최소값과 최대값을 출력함
private void displayScores(List<Integer> record) {
int min = Collections.min(record, null);
int max = Collections.max(record, null);
System.out.println("Min: " + min + ", Max: " + max);
}
}
update()
를 통해 통보받았을 때, 최대 최소값을 출력한다Main.class
public static void main(String[] args) {
ScoreRecord scoreRecord = new ScoreRecord();
// 3개까지의 점수만 출력함
DataSheetView dataSheetView = new DataSheetView(scoreRecord, 3);
// 최대값, 최소값만 출력함
MinMaxView minMaxView = new MinMaxView(scoreRecord);
// 각 통보 대상 클래스를 Observer로 추가
scoreRecord.attach(dataSheetView);
scoreRecord.attach(minMaxView);
// 10 20 30 40 50을 추가
for (int index = 1; index <= 5; index++) {
int score = index * 10;
System.out.println();
System.out.println("Adding " + score);
// 추가할 때마다 최대 3개의 점수 목록과 최대/최소값이 출력됨
scoreRecord.addScore(score);
}
}
실행결과
>>>Adding 10
>>>List of 3 entries:
>>>10
>>>Min: 10, Max: 10
>>>Adding 20
>>>List of 3 entries:
>>>10
>>>20
>>>Min: 10, Max: 20
>>>Adding 30
>>>List of 3 entries:
>>>10
>>>20
>>>30
>>>Min: 10, Max: 30
>>>Adding 40
>>>List of 3 entries:
>>>10
>>>20
>>>30
>>>Min: 10, Max: 40
>>>Adding 50
>>>List of 3 entries:
>>>10
>>>20
>>>30
>>>Min: 10, Max: 50
참조: