객체 상태가 변경될 때 다른 의존 객체에 상태가 변경되었음을 통지하고 자동을 업데이트하도록 하는 패턴
1. 상품의 제고를 나타내는 Stock과 상품의 정보를 출력하는 Display가 있다.
class Stock {
public void update(Product product) {
System.out.println("Stock updated for " + product.getProductName());
}
}
class Display {
public void update(Product product) {
System.out.println("Display updated for " + product.getProductName());
}
}
2. 상품 Product는 변경사항이 있을 때마다 Stock과 Display를 Update한다.
class Product {
private String productName;
private String productStatus;
public void setProductStatus(String productStatus) {
this.productStatus = productStatus;
Stock stock = new Stock();
stock.update(this);
Display display = new Display();
display.update(this);
}
}
위 상황에서 Stock과 Display외에 다른 클래스를 추가하려면 Product클래스를 변경해야 한다. 즉, Product과 다른 클래스간의 강한결합
이 형성되어 있다는 뜻이다.
다른 클래스에
값이 변경되었다는 통지
를 하자!
1. Subject
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notify();
}
2. Product
class Product implements Subject {
private List<Observer> observers = new ArrayList<>();
private String productName;
private String productStatus;
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notify() {
for (Observer observer : observers) {
observer.update(this);
}
}
public void setProductStatus(String productStatus) {
this.productStatus = productStatus;
notifyAllObservers();
}
}
3. Object
interface Observer {
void update(Product product);
}
4. Stock, Display
class Stock implements Observer {
public void update(Product product) {
System.out.println("Stock updated for " + product.getProductName());
}
}
class Display implements Observer {
public void update(Product product) {
System.out.println("Display updated for " + product.getProductName());
}
}
실제 작동과정은 옵저버패턴을 적용하기 전과 후가 비슷하지만 이후 Observer객체를 추가할 때, Product를 수정하지 않아도 동적으로 Observer를 추가할 수 있다.