옵저버 패턴

이정석·2023년 6월 19일
0

디자인패턴

목록 보기
8/23

옵저버 패턴이란?

객체 상태가 변경될 때 다른 의존 객체에 상태가 변경되었음을 통지하고 자동을 업데이트하도록 하는 패턴


문제상황

1. 상품의 제고를 나타내는 Stock과 상품의 정보를 출력하는 Display가 있다.

class Stock {
    public void update(Product product) {
        System.out.println("Stock updated for " + product.getProductName());
    }
}

class Display {
    public void update(Product product) {
        System.out.println("Display updated for " + product.getProductName());
    }
}

2. 상품 Product는 변경사항이 있을 때마다 Stock과 Display를 Update한다.

class Product {
    private String productName;
    private String productStatus;

    public void setProductStatus(String productStatus) {
        this.productStatus = productStatus;
        Stock stock = new Stock();
        stock.update(this);
        Display display = new Display();
        display.update(this);
    }
}

위 상황에서 Stock과 Display외에 다른 클래스를 추가하려면 Product클래스를 변경해야 한다. 즉, Product과 다른 클래스간의 강한결합이 형성되어 있다는 뜻이다.

다른 클래스에 값이 변경되었다는 통지를 하자!


구조

  1. Subject: 관찰되는 객체와 관찰하는 객체의 연산을 정의한 클래스로 observer에 대한 리스트와 리스트에 observer는 저장하는 메소드, 삭제하는 메소드가 있다.
  2. ConcreteSubject: Subject를 구현한 클래스로 실제 구체적인 관찰객체를 나타낸다. 고유의 state값을 가지고 있으며 observer에 상태를 알려줄 getState메소드가 있다.
  3. Observer: Subject의 상태를 관찰하는 객체를 정의한 인터페이스로 Observer객체에 Update메소드로 변경되었음을 알리도록 한다.
  4. ConcreteObserver: Observer 인터페이스를 구현한 클래스로 실제로 Subject의 상태 변화를 관찰하는 객체이다. Update가 실행되면 관찰하는 객체의 현태 상태로 값을 업데이트 한다.

코드(JAVA)

1. Subject

interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notify();
}

2. Product

class Product implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String productName;
    private String productStatus;

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

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

    public void notify() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }

    public void setProductStatus(String productStatus) {
        this.productStatus = productStatus;
        notifyAllObservers();
    }
}

3. Object

interface Observer {
    void update(Product product);
}

4. Stock, Display

class Stock implements Observer {
    public void update(Product product) {
        System.out.println("Stock updated for " + product.getProductName());
    }
}

class Display implements Observer {
    public void update(Product product) {
        System.out.println("Display updated for " + product.getProductName());
    }
}

실제 작동과정은 옵저버패턴을 적용하기 전과 후가 비슷하지만 이후 Observer객체를 추가할 때, Product를 수정하지 않아도 동적으로 Observer를 추가할 수 있다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글