Observer ํจํด, ๋ง์ด ๋ค์ด๋ดค๋ค. GoF์ ์ ์๋ก ์์๋ณด์.
Observer
- ๊ด์ฐฐ์, ๊ฐ์์
 - ๋ณํ๊ฐ ์๊ธฐ๋ฉด ์์์ฑ๋ค.
 - ๋ค๋ง ์ด ๊ด์ฐฐ์๋ ์ฌ๋ฌ๋ช ์ผ ์ ์๋ค.
 
pub-sub Pattern
- Observer๋ณด๋ค ๋ง์ด ์ฐ์ด๋ ํจํด
 - ๋ฐํ-๊ตฌ๋ ํจํด
 - ๋น์ทํ๋ ์๋ฐํ ๋งํ๋ฉด ๋ค๋ฅธ ํจํด์ด๋ค.
 - ํ์ง๋ง ์ด๋ฃจ๋ ค๋ ๋ชฉ์ ์ ๋น์ทํ์ฌ ๊ฐ์ ํจํด์ด๋ผ ๋ณด๋ ์ผ๋ ๋ง๋ค.
 - pub-sub์ด ๋ณด๋ค ์ผ๋ฐ์ ์ธ (observer์ ์์ ์งํฉ) ๊ฐ๋ ์ด๋ผ ์๊ฐ
 
LogManager
- ๋ฐ๋ก ์ ์ ๋ดค๋ LogManager๊ฐ ๊ทธ ํจํด
 - program์ด LogManager์๊ฒ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ,
 - LogManager๋ ๊ตฌ๋ ์(ConsoleLogger, EmailLogger)๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋
 
Observer Pattern์ ์
- ํฌ๋ผ์ฐ๋ํ๋ฉ
 - ๋์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋ ๊ฐ์ฒด๋ฅผ ์
๋ฐ์ดํธํ  ๊ฒ์
- ์ฅ๋ถ (๊ธ์ก)
 - ํฐ์์ ํธ์ ๋
ธํฐ (์ด๋ฆ, ๊ธ์ก)
- ์ค์ ๋ก ํธ์ ์๋ฆผ์ด pub-sub ํจํด์
 - ์ด๋ฅผ ์ด๋ฒคํธ ์ฃผ๋ ์ํคํ
์ฒ๋ผ๊ณ ๋ ํ๋ค.
- ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ฉด ์๋ ค์ค
 
 
 
 
IFundingCallback
public interface IFundingCallback {
    void onMoneyRaised(String backer, int amount);
}- ๋์ผํ ์ธํฐํ์ด์ค๋ก ๋ฐ๊ธฐ ์ํด ๋ง๋ฆ
 
BookkeepingApp
public final class BookkeepingApp implements IFundingCallback {
 
    // ... ์๋ต
 
    @Override
    public void onMoneyRaised(String backer, int amount) {
        // ์ฅ๋ถ์ ์ ๋ด์ญ ์ถ๊ฐ
        // amount๋ง ์ฌ์ฉ
    }
}MobileApp
public final class MobileApp implements IFundingCallback {
 
    @Override
    public void onMoneyRaised(String backer, int amount) {
        // ๋ชจ๋ฐ์ผ ์ฑ์ ์๋ฆผ ๋ณด์ฌ์ค
        // amount, backer ๋๋ค ์ฌ์ฉ
    }
}CrowdFundingAccount
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);
        }
    }
}pub-sub๊ณผ์ ์ฐจ์ด
- ๋ค๋๋ค์ธ ๊ด๊ณ๋ผ๋ฉด pub-sub์ด๋ผ ํ ์ ์๋ค.
 - ์ง๊ธ ์์ ๊ฒฝ์ฐ ๋ฐํ์๊ฐ ํ๋๋ค.
 - ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ฐํ์๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ๋ ์ ์๊ณ , ๊ทธ๊ฑธ ๋ฐ๋ ์ชฝ๋ ์ฌ๋ฌ๊ฐ๋ผ๊ณ ํด๋ณด์.
 - ์ด๋ด ๊ฒฝ์ฐ ๊ทธ ์ค๊ฐ์ ์กฐ์จํด์ฃผ๋ ๊ฐ์ฒด๊ฐ ์์ด์ผ ํ๋ค.
 - ๊ทธ ์ฐจ์ด๊ฐ ์ ๋ถ๋ค. ์๊ฐ์ ๊ฒฝ์ฐ๋ Account์ ์ง์ ์ ์ผ๋ก ๋นจ๋๋ฅผ ๊ฝ๊ณ ์๋ ํํ๋ Observer์ด๋ค.
 - pub-sub์ด๋ผ๋ฉด, support()๋ฅผ ํธ์ถํ๋ฉด, ์ค๊ฐ ๊ด๋ฆฌ ๊ฐ์ฒด์ ์์ฒญํ๊ณ , ๊ทธ ๊ฐ์ฒด๊ฐ ๊ตฌ๋
์๋ค์๊ฒ ๋ค์ ์๋ฆผ์ ์ฃผ๋ ํํ๊ฐ ๋  ๊ฒ์ด๋ค.
- iOS์ NotificationCenter์ ๊ฐ์ ๋ฐฉ์์ด๋ค.
 
 
Observer Pattern๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ 
- Observer Pattern์ ๊ฒฐ๊ตญ ์ฝ๋ฐฑ ํจ์์ ๋ชฉ๋ก์ด๋ค.
 - ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ๋ฐฉ์์ Managed ์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๋๋ ์ฃผ๋ฒ์ด๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ง์  ๊ด๋ฆฌ
 - ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ธฐ๋ฐ ์ธ์ด
- ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์๊ธฐ๋๊ฒ ์๋
 - ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅธ ๊ฒ
 
 
 
CrowdFundingAccount funding;
 
BookkeepingApp book = new BookkeepingApp();
funding.subscribe(book);
 
// ์ฅ๋ถ ์ฑ์ผ๋ก ๋ฌด์ธ๊ฐ ์ฒ๋ฆฌ
 
// ๋คํจ, ์ด์  ๊ฐ์ฒด ์ง์ฐ์.
 
book = null;
 
// ์๊ฐ์ด ๋ง์ด ์ง๋จ - ๊ฐ๋น์ง ์ปฌ๋ ํฐ ํ๋ฒ ๋
// ํ์ง๋ง ์์ง์์ง ์? ์?- funding ๊ฐ์ฒด๊ฐ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ก๊ณ  ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ค์ด๋ผ๊ณ  ์๊ฐํจ
subscribers
 - ๋ช
์์ ์ผ๋ก 
unsubscribe()์ ๊ฐ์ ๋์์ผ๋ก ๋ฐฐ์ด์์ ๋นผ์ค์ผ ํจ 
public void unsubscribe(IFundingCallback sub) {
    subscribers.remove(sub);
}- ์ด๊ฑฐ ์๊น๋จน์ ์์ ์์?โฆ
 - ์ฌ๊ธฐ์ ์ฐพ๊ธฐ๋ ๊ต์ฅํ ์ด๋ ต๋ค..
 - Java์ ๊ฒฝ์ฐ์๋ book์ด ์ง์์ง ๋ ์๋์ผ๋ก 
unsubscribe()๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ค๊ธฐ๋ ์ด๋ ต๋ค.- C++์๋ 
destructor๋ฅผ ํตํด ์๋ํํ ์ ์๋ค. - Swift 
deinit() 
 - C++์๋ 
 - ๋ C++์ ๊ตณ์ด heap์ ์๋ง๋ค๊ณ  stack์ ๋ง๋ค ์๋ ์๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ํจ์ ์ค์ฝํ ๋ฒ์ด๋๋ฉด ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์  ์ํฌ ์ ์๋ค.
- stack์ด ๊ทธ๋ ๊ฒ ๋๋๊น!
 
 
 - ์ด๋ ๊ฒ ๋๋ฉด ํจ์ ์ค์ฝํ ๋ฒ์ด๋๋ฉด ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์  ์ํฌ ์ ์๋ค.