디자인패턴(4) - 옵저버패턴

BBB·2023년 9월 1일
0

디자인패턴

목록 보기
4/5

https://thebook.io/080326/0020/

1. 옵저버패턴의 정의
2. 옵저버패턴 구현
3. 옵저버패턴의 장점
4. 옵저버패턴의 사용
5. 옵저버패턴의 단점

옵저버 패턴과 MVC패턴
MVC 패턴은 옵저버 패턴 + 미디에이터 패턴이라고 한다. 유의해서 보기!

1. 옵저버패턴의 정의

주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
여기서 주체란 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들이란 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체들을 의미한다.

observe : 관찰하다
어떤 객체의 상태가 변할 때, 그와 연관된 객체들에게 알림을 보내는 디자인 패턴

2. 옵저버패턴의 구현

예시참고링크

public interface Coach {
	void subscribe(Crew crew);
    void unsubscribe(Crew crew);
    void notifyCrew(String msg);
}

public interface Crew {
	void update(String msg);
}

public class Baedi implements Coach {
	private List<Crew> crews = new ArrayList<>();
    
    public void eatFood() {
    	System.out.println("Baedi eats Food");
        notifyCrew("I eat food");
    }
    
    public void runaway() {
    	System.out.println("Baedi runs away");
        notifyCrew("I run away");
    }
    
    public void upgradeCutie() {
    	System.out.println("베디코치가 귀여움을 강화했다");
        notifyCrew("나 더 귀여워졌따");
    }
    
    @Override
    public void subscribe(Crew crew) {
    	crews.add(crew);
    }
    
    @Override
    public void unsubscribe(Crew crew) {
    	crews.remove(crew);
    }
    
    @Override
    public void notifyCrew(String msg) {
    	crews.forEach(crew -> crew.update(msg));
    }
}

public class Tiber implements Crew {
	@Override
    public void update(String msg) {
    	System.out.println("Tiber 수신 : " +msg);
    }
}

// lewin, jay 도 Tiber와 같음

public class Main{
	Baedi baedi - new Baedi();
    Crew lewin = new Lewin();
    Crew tiber = new Tiber();
    Crew jay = new Jay();
    
    baedi.subscribe(lewin);
    baedi.subscribe(tiber);
    baedi.subscribe(jay);l
    
    baedi.upgradeCutie();
    // 베디코치가 귀여움을 강화했다
   	// Lewin 수신 : 나 더 귀여워 졌따
    // Tiber 
    // Jay
}

3. 옵저버패턴의 장점

참고링크

  1. 유연한 객체 지향 시스템 구축 - 객체 간 결합도가 낮기 때문에, 변경사항이 생겨도 복잡하지 않게 처리 가능

  2. 개방 폐쇄 원칙 가능

4. 옵저버패턴의 사용

앞서 언급한 것처럼 MVC 패턴에서 사용된다

5. 옵저버패턴의 단점

  1. 옵저버에게 알림이 가는 순서를 보장할 수 없다
  2. 옵저버 <-> 객체 간의 관계가 잘 정의되지 않으면 원하지 않은 동작이 발생할 수 있다
profile
꾸준히 성장하기

0개의 댓글