오늘보다 발전된 내일의 나를 위해…
Design Pattern-Wrapper Pattern
해당 내용은 POCU 아카데미 COMP_2500에서 배운 내용을 공부하기 위해 작성된 글입니다
Proxy Pattern
옵저버 패턴은 옛날에 많이 사용했지만 지금은 좀 더 일반적이고 더 다양하게 사용할 수 있는 방식을 사용한다. A라는 개체가 있다고 하자. B가 A를 감시한다.
어느 순간 A가 바뀌면 B가 그것을 깨닫고 행동을 하게 되는 것이다 그런데 B가 한명만 있는 게 아니다.
여러 개가 있을 수 있다. B, C, D, E도 감시를 하고 있을 수도 있다 하지만 A는 하나이다.
A를 감시하며 A가 변하면 감시하고 있는 것들도 바뀌는 것이다. 이때 쓰는 패턴이 옵저버 패턴이다.
요즘은 옵저버보다 더 자주 사용하는 패턴이 있다.
발행-구독(pub-sub) 패턴
- pub: publisher(발행자)의 줄임말
- sub: subscriber(구독자)의 줄임말
- 옵저버와 비슷하지만 엄밀히 말하면 다른 패턴
- 그러나 이루려는 목적은 비슷하기에 같은 패턴이라고 보는 일도 흔함
사실 이미 발행-구독 패턴에 대해서 코드를 써본적이 있다. 바로 이전 포스트에서의 LogManager이다. (아래 링크 참고)
즉, 여기서 LogManager를 빼면 그게 옵저버 패턴인 것이다.
옵저버 패턴의 예를 하나 들어보자. 크라우드펀딩 예를 구성해보겠다. 돈이 들어올 때마다 두 개체를 업데이트
- 장부를 업데이트(상태는 금액만 필요)
- 모바일 폰에서 노티를 받음( 상태는 이름과 금액이 필요)
IFundingCallback Interface
public interface IFundingCallback{
void onMoneyRaised(String backer, int amount);
}
BookkeepingApp Class
public final class BookkeepingApp implements IFundingCallback{
//멤버 변수와 메서드는 모두 생략
@Override
public void onMoneyRaised(String backer, int amount){
//장부에 새 내역 추가
//amount만 사용
}
}
MobileApp Class
public final class MobileApp implements IFundingCallback{
//멤버 변수와 메서드는 모두 생략
@Override
public void onMoneyRaised(String backer, int amount){
//모바일 앱에 알림을 보여준다
//backer와 amount 모두 사용
}
}
CrowdFundingAccount Class
public final class CrowdFundingAccount{
private int balance;
private ArrayList<IFundingCallback> subscribers;
public CrowdFundingAccount(){
this.subscribers=new ArrayList<IFundingCallback>();
}
public void subscribe(IFundingCallback sub){
subscribers.add(sub);
}
public void support(String backer, int amount){
this.balance+=amount;
for(IFundingCallback sub:subscribers){
sub.onMoneyRaised(backer, amount);
}
}
}
위 코드를 통해 CrowdFundingAccount라는 발행자가 하나이고 ArrayList로 구성된 subscribers를 통해 구독자는 여럿인 것을 볼 수 있다.
pub-sub 패턴과의 차이는 발행자가 하나이다. 즉, pub-sub은 다대다 관계(many-to-many)이고 그걸 조율해주는 중간 클래스가 있을 뿐인 것이다.
옵저버와 pub-sub의 차이는 발행자가 하나냐 여럿이냐의 차이다.