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