디자인패턴_Observer Pattern of Behavioral Pattern

2021. 1. 15. 17:032021/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);
        }
    }
}