Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Observer Pattern 본문

Java/디자인 패턴

Observer Pattern

Seung__ 2021. 11. 11. 21:54

1. Observer Pattern??


  • 객체 사이에 일대다의 의존 관계가 있고, 어떤 객체의 상태가 변하게 되면, 그 객체에 의존성을 가진 다른 객체들이 변화에 통지(notiry or update)를 받고 자동으로 갱신될 수 있게 함.
  • dependent, publish-subscribe

 

 

 

2. 의도와 동기


  • 하나의 객체에 연동되는 여러 객체 집합이 있을 때 변화에 대한 일관성은 유지하고, 객체간의 결합도는 낮게하기 위한 패턴
  • 변화에 관심이 있는 개체에 대한 가정없이 통보될 수 있도록 해야함.
  • 주오 data-view의 관계에서 사요오딤
  • log와 그 handler들의 관계(file, console 등등)

 

 

 

3. Class diagram


 

 

4. 객체 협력 (collaborations)


  • Subject : Observer를 알고 있는 주체, Observer를 더하거나 뺄수 있음
  • Observer : Subject의 변화에 관심을 가지는 객체, 갱신에 필요한 인터페이스 정의, 객체들의 일관성을 유지
  • ConcreteSubject : ConcreteObserver에게 알려주어야하는 상태가 변경될때 통보 (주로 List로 Observer관리)
  • ConcreteObserver : 객체에 대한 참조자를 관리하고, Subject의 일관성 유지하며, Subject가 변경될 때 갱신되는 인터페이스 구현

 

 

5. 중요한 결론 (consequence)


  • Subject와 Observer간의 추상적인 결합만의 존재
  • BroadCast 방식의 교류가 가능
  • 데이타와 그 뷰 사이에 자주 사용되는 방법

 

 

 

6. 예제


  • NumberGenerator를 실행하면 반복문을 돌면서 랜덤 숫자를 생성한다.
  • NumberGenerator는 List로 Observer를 가지고 있음.
  • 숫자를 생성 후에 Observer에 notify를 날린다. 날릴 때 Generator를 넣어서 날림.
  • 각 Observer는 넘어온 Generator를 가지고 메서드를 실행.
  • 즉 어떤 객체에 변경이 생기거나 특정 메서드가 실행되면 Observer의 특정 메서드가 실행됨.
public abstract class NumberGenerator {

    List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer){
        observers.add(observer);
    }

    public void removeObserver(Observer observer){
        observers.remove(observer);
    }

    public void notifyObservers(){
        Iterator<Observer> iterator = observers.iterator();

        while (iterator.hasNext()){
            Observer observer = iterator.next();
            observer.update(this);
        }
    }

    public abstract int getNumber();
    public abstract void execute();
}
public class RandomNumberGenerator extends NumberGenerator{

    private Random random  = new Random();
    private int number;

    @Override
    public int getNumber() {
     return number;
    }

    @Override
    public void execute() {
        for (int i=0; i<50; i++){
            number = random.nextInt(50);
            notifyObservers();
        }
    }
}
public interface Observer {

    public void update(NumberGenerator generator);
}
public class GraphObserver implements Observer{

    @Override
    public void update(NumberGenerator generator) {
        System.out.println("GraphObserver");
        int number = generator.getNumber();

        for (int i=0; i < number; i++){
            System.out.print("*");
        }
        System.out.println();

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class DigitObserver implements Observer {
    @Override
    public void update(NumberGenerator generator) {
        System.out.println("DigitObserver" + generator.getNumber());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Main {

    public static void main(String[] args) {

        NumberGenerator generator = new RandomNumberGenerator();

        Observer observer1 = new DigitObserver();
        Observer observer2 = new GraphObserver();

        generator.addObserver(observer1);
        generator.addObserver(observer2);

        generator.execute();
    }
}

 

 

7. GitHub : 211111 Observer Pattern


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

'Java > 디자인 패턴' 카테고리의 다른 글

복잡한 연결을 단순하게 - Facade Pattern  (0) 2021.11.12
Memento Pattern  (0) 2021.11.11
조건에 따른 상태를 클래스로 표현하여 관리 - State  (0) 2021.11.10
Adapter Pattern  (0) 2021.11.09
Composite Pattern  (0) 2021.11.09
Comments