디자인 패턴) Observer

박우영·2023년 5월 5일
0

디자인 패턴

목록 보기
1/5

Observer 란?


observer 란 뜻 그대로 관찰자 라는 의미이다. 관찰 하는 대상의 상태가 변화되었을때 관찰자에게 상태변화를 알리는 패턴으로 상태변화에 따른 처리를할때 사용하면 좋다.

java 코드 예시


순수 java 코드로 실습해보겠습니다. 아래는 예시 class 들입니다.

  • Observer: 관찰자를 나타내는 인터페이스
  • NumberGenerator: 수를 생성하는 추상클래스
  • GraphObserver: 그래프로 표시하는 클래스
  • DigitObserver: 숫자로 나타내는 클래스
  • RandomNumberGenerator: 랜덤하게 수를 생성하는 클래스

Observer

public interface Observer {
    public abstract void update(NumberGenerator generator);
}

옵저버 클래스입니다. update 메서드를 통해 NumberGenerator 를 관찰하여 상태변화를 알립니다.

NumberGenerator


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

public abstract class NumberGenerator {
    // Observer 를 저장
    private List<Observer> observers = new ArrayList<>();

    // Observer 를 추가
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    //Observer 를 제거
    public void deleteObserver(Observer observer) {
        observers.remove(observer);
    }

    // Observer 에 통지
    public void notifyObserver() {
        for (Observer o :
                observers) {
            o.update(this);
        }
    }

    // 수 취득
    public abstract int getNumber();

    // 수 생성
    public abstract void execute();
}

observer 를 추가,제거 하고 observer에 있는 update를 통해 알리는 기능 과 수를 생성, get 해오는 메서드들이 들어있는 추상 클래스 입니다.

GraphObserver


public class GraphObserver implements Observer{
    @Override
    public void update(NumberGenerator generator) {
        System.out.println("GraphObserver");
        int count = generator.getNumber();
        for (int i = 0; i < count; i++) {
            System.out.print("*");
        }
        System.out.println("");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            
        }
    }
}

수가 생성될때 관찰하여 *모양의 간이그래프로 표시하는 클래스 입니다.

DigitObserver


public class DigitObserver implements Observer {

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

        }
    }
}

수가 생성될때 관찰하여 숫자로 나타내는 클래스입니다.

RandomNumberGenerator


import java.util.Random;

public class RandomNumberGenerator extends NumberGenerator {

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

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

    @Override
    public void execute() {
        for (int i = 0; i < 20; i++) {
            num = random.nextInt(50);
            notifyObserver();
        }
    }
}

랜덤으로 수를 생성하고 생성된 수를 return하는 클래스 입니다.

Main

public class Main {
    public static void main(String[] args) {
        NumberGenerator numberGenerator = new RandomNumberGenerator();
        Observer observer1 = new DigitObserver();
        Observer observer2 = new GraphObserver();
        numberGenerator.addObserver(observer1);
        numberGenerator.addObserver(observer2);
        numberGenerator.execute();
    }
}

Main 클래스 입니다. 실행하면 아래와 같은 출력결과를 얻을 수 있습니다.

호출순서

  • RandomNumberGenerator(Subject)의 상태변화 -> Observer로 통지 -> Observer 가 Subject의 메서드 호출 ...(반복)

Observer 패턴에서 유의할점은 remove를 하지않으면 사용하지 않더라도 가비지 컬렉터에서 객체를 없애지 않으므로 꼭 remove 해줄것.

0개의 댓글