디자인 패턴 2강. Observer 패턴

기타/[고급객체지향 프로그래밍]

2019. 10. 20. 11:53

 

 

[Observer 패턴]

: 객체간 1:n 의존 관계를 정의

: 한개 객체 상태가 변화될때, 그 객체와 의존 관계에 있는 모든 객체들이 자동으로 알림을 받고 상태를 갱신

: 일종의 푸쉬(push) 서비스

 

 

 

[Observer 패턴 기본 구조]

 

 

 

[Observer 패턴 구현하기]

- ConcreteSubject

  : Observer 관리할 배열을 만들어준다 (ArrayList<Observer> observers; )

  : 그리고 생성자 이용해 배열 정의

  : addObserver(Observer o) 구현 (observers.add(o)')

  : removeObserver(Observer o) 구현 (observer.remove(o);)

  : notifyObserver() 구현 (for (Observer o : observers) { o.update(전해줄상태값); }

 

- Subject 인터페이스

  : 위 구조에 작성된 메소드 3개 추상 선언

 

- Observer 인터페이스

  : update() 선언. 이때 괄호안에 concreteSubject에서 전달해준 인자 타입 선언 (update(int n);)

 

- Observer 클래스들

   update(인자값) 메서드 구현해서 인자값으로 클래스 내부 동작 실행.

 

 

 

[Observer 패턴 예시]

#예시1. Observer_panel (+thread 이용법)

더보기

+) Thread.sleep(슬립시간);  : 해당 시간만큼 동작 중지

1. concreteSubject - PrimeObserableThread

2. Subject 인터페이스

3. Observer 인터페이스

4. LabelWindow 클래스 - Observer 클래스들중 하나

5. MainWindow 클래스(main) - 코드일부

: 생성한 Observer클래스들 observer 배열에 추가

: 버튼 누르는 동작 감지후, 해당 버튼 무슨버튼인지 구분후, Observer 배열에 observer들 각각 추가/삭제

# 예시2 - WeatherData

더보기

- Subject 인터페이스

- Observer 인터페이스

- WeatherData 클래스 : ConcreteSubject

- CurrentConditionsDisplay 클래스 : observer 클래스(생성자에 observer 배열에 추가하는 코드 들어있음)

- WeatherStation클래스 : main

# 예시3 - Swing의 actionListener

더보기

- 코드파일 따로 X.

public class SwingObserverExample { 
  JFrame frame; public static void main(String[] args) { 
    SwingObserverExample example = new SwingObserverExample();
    example.go(); 
    }

public void go() { 
  frame = new JFrame(); 
  JButton button = new JButton("정말 해도 될까?"); 
  button.addActionListener(new AngelListener()); 
  button.addActionListener(new DevilListener()); 
  frame.getContentPane().add( BorderLayout.CENTER, button); 
  frame.setSize(200, 200); frame.setVisible(true); 
}

class AngelListener implements ActionListener { 
  public void actionPerformed(ActionEvent event) { 
    System.out.println("안돼. 분명 나중에 후회할거야"); 
  }
} 
class DevilListener implements ActionListener { 
  public void actionPerformed(ActionEvent event) { 
    System.out.println("당연하지. 그냥 저질러 버려!"); 
  } 
}​

# 예시4 - RandomNumberGenerator 클래스

더보기