Chain_of_Responsibility_Pattern - 8BitsCoding/RobotMentor GitHub Wiki
μμ²μ μ²λ¦¬ν μ μλ κΈ°νλ₯Ό νλ μ΄μμ κ°μ²΄μ λΆμ¬ν¨μΌλ‘μ¨ μμ²νλ κ°μ²΄μ μ²λ¦¬νλ κ°μ²΄ μ¬μ΄μ κ²°ν©λλ₯Ό μμ λ ν¨ν΄
μμ²μ ν΄κ²°ν κ°μ²΄λ₯Ό λ§λ λκΉμ§ κ°μ²΄ κ³ λ¦¬λ₯Ό λ°λΌμ μμ²μ μ λ¬
μΌλ°μ μΌλ‘ μ²λ¦¬ν μ μλ λͺ¨λ κ°μ²΄λ€μ κ³ λ¦¬λ‘ λ¬Άκ³ λ§¨μ²μ κ°μ²΄μκ² μμ²μ μ λ¬νμ¬ μ²λ¦¬νμ§ λͺ»νλ©΄ λ€μ κ°μ²΄λ‘ λκΈ°λ λ°©μμΌλ‘ μ§ν

void main() {
λ¬Έμμ* pUser = new κ³ λ±νμ();
μλ΄λ¬Έμ* pHandler = new μ΄λ±λ¬Έμ(new μ€λ±λ¬Έμ(new κ³ λ±λ¬Έμ(NULL)));
// 체μΈμ ꡬμ±
pHandler->μλ΄λ¬Έμμμ(pUser);
delete pHandler;
delete pUser;
return 0;
}class λ¬Έμμ {
public:
virtual const TCHAR* Class() = 0;
};
class μ΄λ±νμ : public λ¬Έμμ {
public:
const TCHAR* Class() { return "μ΄λ±νμ"; }
};
class μ€νμ : public λ¬Έμμ {
public:
const TCHAR* Class() { return "μ€νμ"; }
};
class κ³ λ±νμ : public λ¬Έμμ {
public:
const TCHAR* Class() { return "κ³ λ±νμ"; }
};class μλ΄λ¬Έμ {
public:
μλ΄λ¬Έμ(μλ΄λ¬Έμ* pHandle) : pHandler(pHandle) {}
~μλ΄λ¬Έμ() { if(pHandler) delete pHandler; }
virtual void μλ΄λ¬Έμμμ(λ¬Έμμ* pUser)
{
if(pHandler != NULL)
pHandler->μλ΄λ¬Έμμμ(pUser);
}
private:
μλ΄λ¬Έμ* pHandler;
};
class μ΄λ±μλ΄ : public μλ΄λ¬Έμ
{
public:
μ΄λ±μλ΄(μλ΄λ¬Έμ* pHandle) : μλ΄λ¬Έμ(pHandle) {}
public:
void μλ΄λ¬Έμμμ(λ¬Έμμ* pUser) override
{
if (dynamic_cast<μ΄λ±νμ*>(pUser) != NULL)
cout << "μ΄λ±νμ λ¬Έμ μλ΄μ
λλ€." << endl;
else
μλ΄λ¬Έμ::μλ΄λ¬Έμμμ(pUser);
}
};
class μ€λ±μλ΄ : public μλ΄λ¬Έμ
{
public:
μ€λ±μλ΄(μλ΄λ¬Έμ* pHandle) : μλ΄λ¬Έμ(pHandle) {}
public:
void μλ΄λ¬Έμμμ(λ¬Έμμ* pUser) override
{
if (dynamic_cast<μ€νμ*>(pUser) != NULL)
cout << "μ€νμ λ¬Έμ μλ΄μ
λλ€." << endl;
else
μλ΄λ¬Έμ::μλ΄λ¬Έμμμ(pUser);
}
};
class κ³ λ±μλ΄ : public μλ΄λ¬Έμ
{
public:
κ³ λ±μλ΄(μλ΄λ¬Έμ* pHandle) : μλ΄λ¬Έμ(pHandle) {}
public:
void μλ΄λ¬Έμμμ(λ¬Έμμ* pUser) override
{
if (dynamic_cast<κ³ λ±νμ*>(pUser) != NULL)
cout << "κ³ λ±νμ λ¬Έμ μλ΄μ
λλ€." << endl;
else
μλ΄λ¬Έμ::μλ΄λ¬Έμμμ(pUser);
}
};//------------------------------------------------------------------
// μνμλ΄ ν
νλ¦Ώ ν΄λμ€
template<typename T>
class μνμλ΄ν
νλ¦Ώ : public μνμλ΄λ¬Έμ
{
public:
μνμλ΄ν
νλ¦Ώ(μνμλ΄λ¬Έμ* pHandle) : μνμλ΄λ¬Έμ(pHandle) {}
public:
void μλ΄λ¬Έμ(λ¬Έμμ* pUser) override
{
if (dynamic_cast<T*>(pUser) != NULL)
cout << pUser->Class() << " λ¬Έμ μλ΄μ
λλ€." << endl;
else
μνμλ΄λ¬Έμ::μλ΄λ¬Έμ(pUser);
}
};
//------------------------------------------------------------------
// Main
int _tmain(int argc, _TCHAR* argv[])
{
λ¬Έμμ* pUser = new κ³ λ±νμ();
μνμλ΄λ¬Έμ* pHandler = new μνμλ΄ν
νλ¦Ώ<μ΄λ±νμ>(new μνμλ΄ν
νλ¦Ώ<μ€νμ>(new μνμλ΄ν
νλ¦Ώ<κ³ λ±νμ>(NULL)));
pHandler->μλ΄λ¬Έμ(pUser);
delete pHandler;
delete pUser;
return 0;
}