옵저버 패턴 (Observer Pattern)
- 객체 사이에 일 대 다의 의존 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 하는 패턴
- 자바에서 Observable Class , Observer 인터페이스 제공
- 통보를 하는 클래스가 Observable 이고, 통보를 받는 클래스가 Observer 이다. Observable는 여러개의 Observer를 가질수 있다.
- Push 방식 (통보), Pull(원하는 시점에 update) 두가지 방식 구현 가능하다.
# Observable를 상속받는 클래스 생성
package ObserverPattern;
import java.util.Observable;
public class Company extends Observable {
private String photoUrl;
private String content;
public Company() {
}
// 새로운 소식이 들어왔다고 알려줌 (상태가 변했다고 알려주는 메소드)
public void messageChanged() {
setChanged();
notifyObservers();
}
// 새로운 소식이 들어오는 메소드
public void setMessage(String photoUrl, String content) {
this.photoUrl = photoUrl;
this.content = content;
messageChanged();
}
public String getPhotoUrl() {
return photoUrl;
}
public String getContent() {
return content;
}
}
# 구독자 1
package ObserverPattern;
import java.util.Observable;
import java.util.Observer;
public class Subscriber implements Observer {
private String photoUrl;
private String content;
public Subscriber(Observable observable) {
observable.addObserver(this); // 옵저버로 등록한다.
}
@Override
public void update(Observable obs, Object arg) {
if (obs instanceof Company) {
Company company = (Company) obs;
this.photoUrl = company.getPhotoUrl();
this.content = company.getContent();
System.out.println("1번째 구독자");
System.out.println("photo link : " + photoUrl);
System.out.println("content : " + content);
System.out.println("\n");
}
}
}
#구독자 2
package ObserverPattern;
import java.util.Observable;
import java.util.Observer;
public class Subscriber2 implements Observer {
private String photoUrl;
private String content;
public Subscriber2(Observable observable) {
observable.addObserver(this); // 옵저버로 등록한다.
}
@Override
public void update(Observable obs, Object args) { // 새로운 소식을 받는 메소드
if (obs instanceof Company) {
Company company = (Company) obs;
this.photoUrl = company.getPhotoUrl();
this.content = company.getContent();
System.out.println("2번째 구독자");
System.out.println("photo link : " + photoUrl);
System.out.println("content : " + content);
System.out.println("\n");
}
}
}
#실행 클라이언트
package ObserverPattern;
public class Messenger {
public static void main(String[] args) {
Company company = new Company(); // Subject 클래스를 생성합니다.
Subscriber subscriber1 = new Subscriber(company); // Observer 클래스를 생성합니다.
Subscriber2 subscriber2 = new Subscriber2(company); // Observer 클래스를 생성합니다.
company.setMessage("photo", "이벤트"); // Subject에게 새로운 소식을 전달합니다.
}
}
참고 사이트 : https://includestdio.tistory.com/39
'Java > Design Pattern' 카테고리의 다른 글
[Design Pattern] Chain of Responsibility Pattern (0) | 2020.11.23 |
---|---|
[Design Pattern] Command Pattern (0) | 2020.09.26 |