Chain_of_Responsibility_Pattern - 8BitsCoding/RobotMentor GitHub Wiki

μ •μ˜

μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 기회λ₯Ό ν•˜λ‚˜ μ΄μƒμ˜ 객체에 λΆ€μ—¬ν•¨μœΌλ‘œμ¨ μš”μ²­ν•˜λŠ” 객체와 μ²˜λ¦¬ν•˜λŠ” 객체 μ‚¬μ΄μ˜ 결합도λ₯Ό μ—†μ• λŠ” νŒ¨ν„΄

μš”μ²­μ„ ν•΄κ²°ν•  객체λ₯Ό λ§Œλ‚  λ•ŒκΉŒμ§€ 객체 고리λ₯Ό λ”°λΌμ„œ μš”μ²­μ„ 전달

일반적으둜 μ²˜λ¦¬ν•  수 μžˆλŠ” λͺ¨λ“  객체듀을 고리둜 λ¬Άκ³  맨처음 κ°μ²΄μ—κ²Œ μš”μ²­μ„ μ „λ‹¬ν•˜μ—¬ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λ©΄ λ‹€μŒ 객체둜 λ„˜κΈ°λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰


μ˜ˆμ‹œλ‘œ μ„€λͺ…

이미지1

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;
}

μ°Έκ³ μ‚¬μ΄νŠΈ

μ°Έκ³ μ‚¬μ΄νŠΈ

⚠️ **GitHub.com Fallback** ⚠️