Observer 패턴, 많이 들어봤다. GoF의 정의로 알아보자.
public interface IFundingCallback {
void onMoneyRaised(String backer, int amount);
}
public final class BookkeepingApp implements IFundingCallback {
// ... 생략
@Override
public void onMoneyRaised(String backer, int amount) {
// 장부에 새 내역 추가
// amount만 사용
}
}
public final class MobileApp implements IFundingCallback {
@Override
public void onMoneyRaised(String backer, int amount) {
// 모바일 앱에 알림 보여줌
// amount, backer 둘다 사용
}
}
public final class CrowdFundingAccount {
private int balance;
private ArrayList<IFundingCallback> subscribers;
public CrowdFundingAccount() {
this.subscrivers = new ArrayList<IFundingCallback>();
}
public void subscribe(IFundingCallBack sub) {
subscrivers.add(sub);
}
public void support(String backer, int amound) {
this.balance += amount;
for (IFundingCallback sub : subscribers) {
sub.onMoneyRaised(backer, amount);
}
}
}
CrowdFundingAccount funding;
BookkeepingApp book = new BookkeepingApp();
funding.subscribe(book);
// 장부 앱으로 무언가 처리
// 다함, 이제 개체 지우자.
book = null;
// 시간이 많이 지남 - 가비지 컬렉터 한번 돎
// 하지만 안지워짐 응? 왜?
subscribers
unsubscribe()
와 같은 동작으로 배열에서 빼줘야 함public void unsubscribe(IFundingCallback sub) {
subscribers.remove(sub);
}
unsubscribe()
를 호출하게 만들기도 어렵다.destructor
를 통해 자동화할 수 있다.deinit()