옵저버 패턴 ( Observer Pattern )
감시자 패턴이라고 볼 수 있다.
여러 개의 옵저버 클래스들이 있고, 그것들은 감시자이다.
어떤 하나의 객체의 상태가 변했다고 치자. 그 상태 변화를 감시자들은 눈치채고 통보를 하게 된다.
이것이 내가 이해한 옵저버 패턴이다.
먼저, 옵저버 패턴의 가장 기본적인 예시를 들어 구현한 코드이다.
1. Teacher 와 Student, 두 개의 인터페이스를 생성해주었다.
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 |