본문 바로가기
Develop/Design Pattern

옵저버 패턴이란?

by jaeyoungb 2022. 8. 17.

옵저버 패턴 ( Observer Pattern )

 

감시자 패턴이라고 볼 수 있다.

 

여러 개의 옵저버 클래스들이 있고, 그것들은 감시자이다.

 

어떤 하나의 객체의 상태가 변했다고 치자. 그 상태 변화를 감시자들은 눈치채고 통보를 하게 된다.

 

이것이 내가 이해한 옵저버 패턴이다.

 

 

먼저, 옵저버 패턴의 가장 기본적인 예시를 들어 구현한 코드이다.

 

1. TeacherStudent, 두 개의 인터페이스를 생성해주었다.

package observer;

public interface Teacher {

    void attach(Student student);
    void detach(Student student);
    void notifyStudent(String message);
}
package observer;

public interface Student {

    void update(String message);
}

 


2. 각 인터페이스를 구현할 객체들을 만들었다.

package observer;

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

public class Taylor implements Teacher{

    private List<Student> students = new ArrayList<>();

    public void teachMath() {
        System.out.println("테일러 선생님이 수학을 가르친다.");
        notifyStudent("지금부터 수학가르칠거다~");
    }

    public void startAnnoying() {
        System.out.println("테일러 선생님이 화를 내신다.");
        notifyStudent("혼낸다!");
    }

    public void giveHomework() {
        System.out.println("테일러 선생님이 숙제를 내주신다.");
        notifyStudent("오늘 숙제 내줄거다~!");
    }

    @Override
    public void attach(Student student) {
        students.add(student);
    }

    @Override
    public void detach(Student student) {
        students.remove(student);
    }

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

package observer;

public class Olivia implements Student{
    @Override
    public void update(String message) {
        System.out.println("Olivia 수신 : " + message);
    }
}

package observer;

public class John implements Student{
    @Override
    public void update(String message) {
        System.out.println("John 수신 : " + message);
    }
}

package observer;

public class Lucas implements Student{
    @Override
    public void update(String message) {
        System.out.println("Lucas 수신 : " + message);
    }
}

 

Teacher 인터페이스를 구현할 Taylor 클래스

 

Student 인터페이스를 구현할 Olivia, John, Lucas 클래스

 

Taylor 클래스에는 생성될 Student 의 객체들이 들어갈 arraylist 를 생성해준다.

 

그 다음, 본 객체의 상태가 변경될 메서드 ( teachMath(), startAnnoying(), giveHomework() ) 들을 생성해준다.

 

각 메서드들 안에는 그 상태를 통지할 notifyStudent 메서드를 구현해준다.

 

인터페이스를 구현받는 클래스이기 때문에, attach/detach/notifyStudent 를 오버라이딩 해준다.

 

(notifyStudent 메서드에는 Taylor 객체의 상태가 변경될 때, 그 변경 사항을 통지할 메세지 또한 업데이트 되는 구문을 사용해주었다.)

 

각 학생들의 클래스는 위 코드와 같이 간단하게 작성했다.

 

 

이제 메인 클래스로 가서 테스트를 해보자.

package observer;

public class ObserverTest {

    public static void main(String[] args) {

        Taylor taylor = new Taylor();
        Olivia olivia = new Olivia();
        John john = new John();
        Lucas lucas = new Lucas();

        taylor.attach(olivia);
        taylor.attach(john);
        taylor.attach(lucas);

        taylor.giveHomework();
    }
}

Taylor, Olivia, John, Lucas 객체들을 생성해주고, Teacher 인터페이스를 구현받는 Taylor 객체안의 배열리스트에 학생들을 넣어준다.

 

그리고, Taylor 의 상태를 변경하면??

 

다음과 같은 결과가 나타난다.

 

옵저버 패턴은 약간 이런 식으로 작동한다 라는 걸 보여준 것이다.

 

코드 자체가 굉장히 간단하고 별볼일 없이 느껴질 수도 있겠지만, 이 코드를 작성해보면서 옵저버 패턴의 전반적인 흐름을 쉽게 이해할 수 있었던 것 같다.

 

(부디, 코드가 별볼일 없어도 눈감아 주시길 바랍니다..ㅜ 틀린 부분이 있다면 피드백 환영합니다!)

 

처음에, 이 예시를 해보면서 느꼈던 것은 왜 Student 객체들을 Teacher 객체의 배열리스트에 넣어주어야 될까 였다.

 

이젠 깨달았지만, 넣어주지 않았더라면 각 옵저버들이 하나의 객체의 상태 변경에 반응하지 못했을 것이다.

 

 

도움을 받은 글)

https://johngrib.github.io/wiki/pattern/observer/

https://pjh3749.tistory.com/266

 

'Develop > Design Pattern' 카테고리의 다른 글

팩토리 패턴이란?  (0) 2022.07.27
싱글톤 패턴이란?  (0) 2022.07.26
디자인 패턴이란?  (0) 2022.07.25