개발 무지렁이

[Java] 옵저버(Observer) 패턴 본문

Backend/자바

[Java] 옵저버(Observer) 패턴

Gaejirang-e 2022. 12. 3. 14:35

옵저버 패턴


관찰대상에 변화가 생겼을 때, 연결된 대상에 2차적 행동을 하는 구조를 말한다.

  1. 관찰대상(버튼)이 있어야 한다.
  2. 관찰대상(버튼)에 무언가를 맡겨야 한다.
  3. 변화가 생겼을 때, 연결된 Listener의 메서드를 호출해야 한다.
  4. Listener를 따르는 클래스의 오버라이딩된 메서드에서 실제 작동하는 메서드를 호출해준다.
❓ Listener는 표준 규격이다.
: 2022년 자동차(버튼)를 만들 때 국제 표준 타이어 규격(Listener)에 맞춘다
  2028년 미쉐린 타이어(클래스)를 만들 때, 국제 표준 타이어 규격(Listener)을 따라서 만든다
  2028년 한국 타이어(클래스)를 만들 때, 국제 표준 타이어 규격(Listener)을 따라서 만든다
  2022년에 만든 자동차에 2028년에 만든 미쉐린 / 한국 타이어로 교체할 수 있다 (표준 규격을 따랐기 때문에)

  ※국제 표준 타이어 규격(Listener)에는 특정 타이어(미쉐린, 한국)에 대한 언급이 있으면 안된다.
❓ 표준 규격(Listener)가 없다면?
: 자동차는 특정 타이어마다 교체 매뉴얼을 숙지하고 있어야한다. (나중에 어떤 타이어로 교체될 지 모르기 때문에)
❓ 표준 규격(Listener)이 왜 필요할까?
: 자동차가 특정 타이어마다 교체 매뉴얼을 숙지하고 있지 않아도 된다. 규격만을 신경쓰면 된다.
: 범용성

ex

class Main {
    public static void main(String[] args) {
        CarButton aCarButton = new CarButton(); // 1. 관찰대상(버튼)이 있어야 한다.
        aCarButton.setClickEventListener(new 미쉐린 타이어());
        aCarButton.fireClick(); // 2. 관찰대상(버튼)에 무언가를 맡겨야한다.
        // 자동차의 타이어가 미쉐린타이어로 교체되었습니다.

        aCarButton.setClickEventListener(new 한국 타이어());
        aCarButton.fireClick();
        // 자동차의 타이어가 한국타이어로 교체되었습니다.
    }
}

interface Listener { // 표준 규격
    void listen();
}

class CarButton {
    Listener aListener;
    public void setClickEventListener(Listener aListener) {
        this.aListener = aListener;
    }
    public void fireClick() {
        aListener.listen(); // 3. 변화가 생겼을 때, 연결된 Listener의 메서드를 호출해야 한다.
    }
}

class 미쉐린타이어 implements Listener {
    @Override
    public void listen() {
        미쉐린타이어로_교체(); // 4. Listener를 따르는 클래스의 오버라이딩된 메서드에서 실제 작동하는 메서드를 호출해준다.
    }
    public void 미쉐린타이어로_교체() {
        System.out.println("자동차의 타이어가 미쉐린타이어로 교체되었습니다");
    }
}

class 한국타이어 implements Listener {
    @Override
    public void listen() {
        한국타이어로_교체(); // 4. Listener를 따르는 클래스의 오버라이딩된 메서드에서 실제 작동하는 메서드를 호출해준다.
    }
    public void 한국타이어로_교체() {
        System.out.println("자동차의 타이어가 한국타이어로 교체되었습니다");
    }
}
Comments