Observer_Pattern - 8BitsCoding/RobotMentor GitHub Wiki
ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค ๋ชจ๋์๊ฒ ์ฐ๋ฝ์ด ๊ฐ๊ณ ์๋์ผ๋ก ๋ด์ฉ์ด ๊ฐฑ์ ๋๋ ํจํด
์ผ๋ฐฉ์ ํต์ง(Broadcast) ๋ฐฉ์์ ํจํด
int main() {
๋ฐฉ์ก์ฌ_์ธํฐํ์ดํธ* pSubject = new ์ฝ๋ฆฌ์๋ฐฉ์ก;
์ต์ ๋ฒ_์ธํฐํ์ด์ค* pObserver1 = new ์์ฒญ์("ํ๊ธธ๋");
์ต์ ๋ฒ_์ธํฐํ์ด์ค* pObserver2 = new ์์ฒญ์("ํํ์");
์ต์ ๋ฒ_์ธํฐํ์ด์ค* pObserver3 = new ์์ฒญ์("๋น๋๊ธฐ");
pSubject->๋ฐฉ์ก์์ฒญ๋ฑ๋ก(pObserver1);
pSubject->๋ฐฉ์ก์์ฒญ๋ฑ๋ก(pObserver2);
pSubject->๋ฐฉ์ก์์ฒญ๋ฑ๋ก(pObserver3);
pSubject->๋ด์ค("๋ ์จ๋ฅผ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.");
pSubject->๋ฐฉ์ก์์ฒญํด์ (pObserver1);
pSubject->๋ฐฉ์ก์์ฒญํด์ (pObserver2);
delete pSubject;
delete pObserver1;
delete pObserver2;
delete pObserver3;
return 0;
}
class ์ต์ ๋ฒ_์ธํฐํ์ด์ค {
public:
virtual void ๋ฐฉ์ก์์ฒญ(const TCHAR* new) = 0;
virtual const TCHAR* ์ด๋ฆ() const = 0;
};
class ์์ฒญ์ : public ์ต์ ๋ฒ_์ธํฐํ์ดํธ {
public:
์์ฒญ์(const TCHAR* name) : mName(name) {}
๋ฐฉ์ก์์ฒญ(const TCHAR* news) override { cout << mName << " : " << news << endl; }
const TCHAR* ์ด๋ฆ() const { return mName.c_str(); }
private:
tsring mName;
};
class ๋ฐฉ์ก์ฌ_์ธํฐํ์ด์ค
{
public:
void ๋ฐฉ์ก์์ฒญ๋ฑ๋ก(์ต์ ๋ฒ_์ธํฐํ์ด์ค* o) { mList.AddTail(o); cout << "๋ฐฉ์ก ์ ์ฒญ : " << o->์ด๋ฆ() << endl; }
void ๋ฐฉ์ก์์ฒญํด์ (์ต์ ๋ฒ_์ธํฐํ์ด์ค* o) { mList.RemoveAt(mList.Find(o)); cout << "๋ฐฉ์ก ํด์ง : " << o->์ด๋ฆ() << endl; }
protected:
void ์ก์ถ(const TCHAR* news)
{
POSITION pos = mList.GetHeadPosition();
while (pos != NULL)
mList.GetNext(pos)->๋ฐฉ์ก์์ฒญ(news);
}
public:
virtual void ๋ด์ค(const TCHAR* news) = 0;
private:
CAtlList<์ต์ ๋ฒ_์ธํฐํ์ด์ค*> mList;
};
class ์ฝ๋ฆฌ์๋ฐฉ์ก : public ๋ฐฉ์ก์ฌ_์ธํฐํ์ด์ค
{
public:
void ๋ด์ค(const TCHAR* news) override { ์ก์ถ(news); }
};