본문 바로가기
스터디/Design Pattern

디자인 패턴 - 옵저버 패턴 (Observer Pattern)

by 헤콩 2020. 5. 30.
반응형

옵저버 패턴 (Observer Pattern)

 

 

행위 패턴 (Behavioral Pattern) 중 하나

    => 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴

    => 1. 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지에 대해서 중점을 둔다.

    => 2. 객체 사이의 결합도를 최소화 하는 것에 중점을 둔다.

 

- 관찰 대상의 상태가 변화했을 때, 관찰자(Observer)에게 통지하는 패턴

- 상태 변화에 따른 처리를 기술할 때 효과적으로 활용 (MVC 패턴에서 Model과 View의 분리 등..)

- Observer 클래스에 상태 변화를 알려주고,

   Observer는 다시 그 변화에 맞는 결과를 나타낸다.

 

"한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 정보가 자동으로 갱신되는 방식으로,
일대다(one-to-many) 의존성을 정의합니다."
                          			      - Head First Design Pattern

인터페이스 1 (Teacher)

public interface Teacher {
    void subscribe(Students stu);
    void unsubscribe(Students stu);
    void notifyStudent(String msg);
}

 

인터페이스 2 (Students)

public interface Students {
    void update(String msg);
}

 

상태 변화가 일어날 클래스 (Kim - Teacher)

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

public class Kim implements Teacher {
    private List<Students> list = new ArrayList<>();

    public void eatFood() {
        System.out.println("김선생님이 밥을 먹는다.");
        notifyStudent("나 밥 먹었다.");
    }

    public void runaway() {
        System.out.println("김선생님이 도망갔다.");
        notifyStudent("집 가라 얘들아.");
    }

    @Override
    public void subscribe(Students stu) {
        list.add(stu);
    }

    @Override
    public void unsubscribe(Students stu) {
        list.remove(stu);
    }

    @Override
    public void notifyStudent(String msg) {
        list.forEach(students -> students.update(msg));
    }
}

 

관찰자 클래스 1 (Lee - Students)

public class Lee implements Students {
    @Override
    public void update(String msg) {
        System.out.println("Lee 수신 : "+msg);
    }
}

 

관찰자 클래스 1 (Park - Students)

public class Park implements Students {
    @Override
    public void update(String msg) {
        System.out.println("Park 수신 : "+msg);
    }
}

메인 클래스 1 (ObserverMain)

public class ObserverMain {

    public static void main(String[] args) {
        Kim kim = new Kim();
        Students lee = new Lee();
        Students park = new Park();

        kim.subscribe(lee);
        kim.subscribe(park);

        kim.eatFood();
    }
}

출력 결과

 

 

 

 

 

 

 

 

참고 :

 

디자인 패턴 정리

안녕하세요~ Jay의 블로그입니다.

realzero0.github.io

 

[디자인패턴] 옵저버 패턴 (Observer Pattern) 아주 간단하게 정리해보기

옵저버 패턴이란? 옵저버란 스타크래프트 프로토스의 유닛으로 적들을 관찰하기 위해 탄생한 유닛이다. 테란전에서 필수 유닛이며 옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관

pjh3749.tistory.com

 

반응형

댓글