Observer Pattern이란?

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

클래스 다이어그램과 코드로 확인하겠습니다.

 

계산기가 존재하며 setNumber() 을 통해서 숫자가 바뀔때마다 계산기가 가진 observer의 update()를 호출합니다. 여기서 n1, n2가 관찰 대상입니다. MinusPrint 와 PlusPrint는 관찰자입니다. 

1. Observer interface

public interface Observer {

    void update(double n1, double n2);
}

 

2. Subject interface

public interface Subject {
    void addObserver(Observer observer);
    void remove(Observer observer);
    void notifyObservers();
}

 

3. Calculator class

import java.util.ArrayList;
import java.util.List;

public class Calculator implements Subject{

    private List<Observer> observerList;
    private double n1;
    private double n2;
    public Calculator() {
        observerList = new ArrayList<>();
    }

    public void setNumber(double n1, double n2){
        this.n1=n1;
        this.n2=n2;
        notifyObservers();
    }

    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void remove(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for(Observer ob: observerList){
            ob.update(n1,n2);
        }
    }
}

 

4. PlusPrint class

public class PlusPrint implements Observer{
    @Override
    public void update(double n1, double n2) {
        System.out.println(n1+n2);
    }
}

 

5. MinsPrint class

public class MinusPrint implements Observer{
    @Override
    public void update(double n1, double n2) {
        System.out.println(n1-n2);
    }
}

 

6. Main class

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        PlusPrint plusPrint = new PlusPrint();
        MinusPrint minusPrint = new MinusPrint();

        // plus observer 추가
        calculator.addObserver(plusPrint);
        // 숫자 변경
        calculator.setNumber(1,2);

        // minus observer 추가
        calculator.addObserver(minusPrint);
        // 숫자 변경
        calculator.setNumber(3,7);


        // plus observer 제거
        calculator.remove(plusPrint);
        // 숫자 변경
        calculator.setNumber(5,0);


    }
}

 

7. 위의 함수를 실행했을 때 나오는 결과물

 

지금까지 Observer pattern을 알아보았습니다. 다음은 Decorator pattern에 관하여 포스팅하겠습니다. 감사합니다. 

전체 코드는 아래에서 확인 가능합니다:)

https://github.com/rlaehdals/design-pattern

 

GitHub - rlaehdals/design-pattern

Contribute to rlaehdals/design-pattern development by creating an account on GitHub.

github.com