Proxy_Pattern - 8BitsCoding/RobotMentor GitHub Wiki

์ •์˜

๋Œ€๋ฆฌ์ž๋กœ์จ ์ผ์„ ๋งก๊ธฐ๋ฉด ๊ทธ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํŒจํ„ด


์˜ˆ์‹œ๋กœ ์„ค๋ช…

์ด๋ฏธ์ง€1

// Main
int _tmain(int argc, _TCHAR* argv[])
{
    Image* pImage = new ProxyImage(_T("Image.png"));

    // ํ•˜๊ณ  ์‹ถ์€๊ฒŒ ํ•œ ๋ฒˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ ๋˜๋ฉด ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ทธ๋ƒฅ ๋ถˆ๋Ÿฌ์„œ ์“ฐ๊ณ  ์‹ถ์Œ
    pImage->ShowImage();    // ๋กœ๋”ฉ ๋ฐ ์ถœ๋ ฅ

    // ์—ฌ๊ธฐ๋Š” ๊ทธ๋ƒฅ ๋ถˆ๋Ÿฌ ์“ฐ๋Š” ๋ถ€๋ถ„.
    pImage->ShowImage();    // ์บ์‹ฑ ์ถœ๋ ฅ
    pImage->ShowImage();    // ์บ์‹ฑ ์ถœ๋ ฅ
    delete pImage;
 
    return 0;
}
// Subject ์ธํ„ฐํŽ˜์ด์Šค
class Image
{
public:
    virtual void ShowImage() = 0;
};
// RealSubject ์ƒ์† ํด๋ž˜์Šค
class RealImage : public Image
{
public:
    RealImage(const TCHAR* name) : mFile(name) {}
 
public:
    void LoadImage() { wcout << "disk from loading file : " << mFile.c_str() << endl; }
    void ShowImage() { wcout << "show image : " << mFile.c_str() << endl; }
 
private:
    tstring mFile;
};
 
//------------------------------------------------------------------
// Proxy ์ƒ์† ํด๋ž˜์Šค
class ProxyImage : public Image
{
public:
    ProxyImage(const TCHAR* name) : mFile(name), mImage(NULL) {}
    ~ProxyImage() { if (mImage) delete mImage; }
 
public:
    void ShowImage() 
    {
        if (!mImage)
        {
            mImage = new RealImage(mFile.c_str());
            mImage->LoadImage();
        }
 
        mImage->ShowImage();
    }
 
private:
    RealImage* mImage;
    tstring mFile;
};

์ฐธ๊ณ ์‚ฌ์ดํŠธ