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