Observer Pattern이란?
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 즉,
publisher(발행자), Observer(관찰자) = subcriber (구독자)의 관계를 알고리즘화 하기위한 패턴이다.
신문사와 신문구독자들, 카페관리자와 카페회원들의 관계와 같이 한 개체가 여러 개체에게 알림이나 공지와 같이 정보를 넘겨주는 경우에 해당한다.
주로 composition방식을 이용한다.
*composition(구성)
A에 B가 있다.
한 객체에 객체를 포함시키는(has ~a 관계)가 아닌 인터페이스를 포함하는 방식
설계
1. Publisher interface와 Observer interface를 정의한다.
2. Publisher interface는 Observer interface를 관리하는 method를 가진다.
2. 두 인터페이스를 implements(구현)한 클래스들을 이용한다.
예제)
import java.util.ArrayList;
interface Observer{//관찰자(구독자) 인터페이스
public abstract void update(String title, String news);
}
interface Publisher{//발행자 인터페이스
public void add(Observer observer);
public void delete(Observer observer);
public void notifyObserver();
}
class ClothingStore implements Publisher{//옷가게
//field
private ArrayList<Observer> customers;//고객들 데이터베이스
private String title;
private String news;
//constructor
public ClothingStore() {
customers = new ArrayList<>();
}
@Override
public void add(Observer observer) {//고객 데이터베이스에 고객추가
customers.add(observer);
}
@Override
public void delete(Observer observer) {//고객 삭제
int index = customers.indexOf(observer);
customers.remove(index);
}
@Override
public void notifyObserver() {//전체알림
for(Observer observer:customers) {
observer.update(title, news);
}
}
public void setNews(String title, String news) {//소식 설정 후 알림실시
this.title = title;
this.news = news;
notifyObserver();
}
}
class Customer implements Observer{
private String newsString;
private Publisher publisher;
public Customer(Publisher publisher) {
this.publisher = publisher;
this.publisher.add(this);
}
@Override
public void update(String title, String news) {
this.newsString = title+"\n"+news;
disp();
}
public void disp() {
System.out.println("\n\n"+"회원님에게 "+"새로운 소식이 도착했습니다.\n"+newsString);
}
}
public class ObserverPattern{
public static void main(String args[]) {
ClothingStore store = new ClothingStore();
Customer customer1 = new Customer(store);
Customer customer2 = new Customer(store);
store.setNews("가을 코트 업데이트(20여종)" , "버버리코트, 닥스코트 등 다양한 코드가 새로 들어왔으니 구경오세요!");
store.setNews("여름재고 특가 세일(50~80%)", "여름 재고 저렴한 가격에 처분합니다!");
}
}
출력결과
-------------------------------------------------------------------
회원님에게 새로운 소식이 도착했습니다.
가을 코트 업데이트(20여종)
버버리코트, 닥스코트 등 다양한 코드가 새로 들어왔으니 구경오세요!
회원님에게 새로운 소식이 도착했습니다.
가을 코트 업데이트(20여종)
버버리코트, 닥스코트 등 다양한 코드가 새로 들어왔으니 구경오세요!
회원님에게 새로운 소식이 도착했습니다.
여름재고 특가 세일(50~80%)
여름 재고 저렴한 가격에 처분합니다!
회원님에게 새로운 소식이 도착했습니다.
여름재고 특가 세일(50~80%)
여름 재고 저렴한 가격에 처분합니다!
'Design Pattern' 카테고리의 다른 글
Templete method pattern (0) | 2018.10.11 |
---|