본문으로 바로가기

Observer Pattern

category Design Pattern 2018. 10. 11. 17:24

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