디자인패턴_Observer Pattern of Behavioral Pattern
2021. 1. 15. 17:03ㆍ2021/JOB DA STUDY
Observer Pattern이란,
한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 1:多 객체 의존 관계를 구성하는 패턴
- 데이터 변경이 발생하는 경우, 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용
Observer(Interface)
- 데이터 변경을 통보받는 인터페이스
- Subject가 Observer 인터페이스의 update() 메서드를 호출 -> ConcreteSubject의 데이터 변경을 ConcreteObserver에 통보
Subject(Class)
- ConcreteObserver 객체를 관리하는 요소
- Observer 인터페이스를 참조해서 ConcreteObserver를 관리하므로, ConcreteObserver를 관리하므로, ConcreteObserver의 변화에 독립적
ConcreteSubject
- 변경 관리 대상이 되는 데이터가 있는 클래스 (통보 클래스)
- 데이터 변경을 위한 메서드인 setState가 있다.
- setState() 메서드는 자신의 데이터인 subjectState를 변경하고, Subject의 notifyObservers() 메서드를 호출해 ConcreteObserver 객체에 변경을 통보
ConcreteObserver
- ConcreteSubject의 변경을 통보받는 클래스
- Observer 인터페이스의 update() 메서드를 구현함으로써 변경을 통보받는다.
- 변경된 데이터는 ConcreteSubject의 getState() 메서드를 호출함으로써 변경을 조회
여러가지 방식으로 성적 출력
- 입력된 성적 값을 출력하는 프로그램
public class ScoreRecord{
private List<Integer> scores = new ArrayList<Integer>();
private DataSheetView dataSheetView;
//새로운 점수를 추가(addScore)하면, 출력하는 DataSheetView에 통보(update())하여 출력하는 부분 갱신
public void setDataSheetView(DataSheetView dataSheetView) {this.dataSheetView
= dataSheetView; }
public void addScore(int score){
scores.add(score);
dataSheetView.update();
}
//출력하는 부분에서 변화된 내용을 얻어감
public List<Integer> getScoreRecord() { return scores; }
}
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();
//조회된 점수를 viewCount 만큼만 출력
displayScores(record, 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();
}
public class Client{
public static void main(String[] args){
ScoreRecord scoreRecord = new ScoreRecord();
DataSheetView dataSheetView = new DataSheetView(scoreRecord, 3);
scoreRecord.setDataSheetView(dataSheetView);
for(int index = 1; index <= 5; index++){
int score = index * 10;
System.out.println("Adding" + score);
scoreRecord.addScore(score);
}
}
}
'2021 > JOB DA STUDY' 카테고리의 다른 글
디자인패턴_Factory Method Pattern of Creational Pattern (0) | 2021.01.19 |
---|---|
디자인패턴_Decorator Pattern of Structural Pattern (0) | 2021.01.19 |
디자인패턴_Template Pattern of Behavioral Pattern (0) | 2021.01.15 |
Super (0) | 2021.01.15 |
디자인패턴_Command Pattern of Behavioral Pattern (0) | 2021.01.14 |