Java/Design Pattern

[Design Pattern] Observer Pattern

예은파파 2020. 10. 2. 17:24

 

옵저버 패턴 (Observer Pattern)

  • 객체 사이에 일 대 다의 의존 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 하는 패턴
  • 자바에서 Observable Class , Observer 인터페이스 제공
  • 통보를 하는 클래스가 Observable 이고, 통보를 받는 클래스가 Observer 이다. Observable는 여러개의 Observer를 가질수 있다.
  • Push 방식 (통보), Pull(원하는 시점에 update) 두가지 방식 구현 가능하다.

 

 

Observer Pattern 다이어그램

 

# 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