13. 가상 프락시 구현

13. 4 구현 

프락시 패턴 중에 가상 프락시에 대한 예제 프로그램을 구현하는 순서는 IConvert와 ImageConverter를 구현한 후에 가상 프락시인 VirtualConverter 순으로 하겠습니다.

13.4.1 IConvert와 ImageConverter

IConvert에서는 이미지를 설정하고 얻어오는 멤버 속성 Image와 이미지를 리셋하는 ClearImage, 변환하는 ConvertImage 메서드를 약속합니다. 그리고, ImageConverter에서는 이들에 대한 구현하면 되겠죠. 다만, 가상 프락시에 대한 설명을 위해 ConvertImage 메서드 내에서는 시간을 의도적으로 지연시키겠습니다.

▶ IConvert.cs

namespace VirtualProxy
{
    interface IConvert
    {
        string Image
        {
            get;
            set;
        }        
        void ClearImage();
        string ConvertImage(); 
    }
}

▶ ImageConverter.cs

using System;
using System.Threading;
namespace VirtualProxy
{
    class ImageConverter:IConvert
    {
        public string Image
        {
            get; 
            set;
        }
        public ImageConverter()
        {	
            Image = string.Empty;
        }    
        public void ClearImage()
        {
            Image = string.Empty;
        }
        public string ConvertImage()
        {
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine("{0}이미지 변환 작업중",Image);
                Thread.Sleep(200);
            }
            Image = Image.ToLower();            
            return Image;
        }
    }
}

 

13.4.2 VirtualConverter

가상 프락시 개체는 내부에 실제 개체인 ImageConverter를 이용하여 작업을 수행하면 됩니다. 수행 비용이많이 들어가는 ConvertImage 메서드에서는 쓰레드를 생성하고 ‘변환 중’이라는 것을 사용자에게 알려주면 되겠죠. 대신 쓰레드에서는 실제 개체를 이용하여 변환을 요청해야 합니다. 그리고, 변환 결과를 얻어올 수 있게 GetImage에서는 실제 개체가 변환 작업이 완료하였는지를 확인하는 작업이 필요합니다. 만약, 변환 작업이 계속 진행 중이라면 이에 대한 정보를 주어야 할 것이며 완료 되었다면 실제 개체를 이용하여 변환된 이미지를 반환하면 될 것입니다.

 ▶ VirtualConverter.cs

using System;
using System.Threading;
namespace VirtualProxy
{
    class VirtualConverter : IConvert
    {
        ImageConverter realconverter = new ImageConverter();
        Thread thread = null;
        public string Image
        {
            get
            {
                return realconverter.Image;
            }
            set
            {
                realconverter.Image = value;
            }
        }
        public VirtualConverter()
        {
            Image = string.Empty;
        }
        public void ClearImage()
        {
            Image = string.Empty;
        }


        public string ConvertImage()
        {
            if (thread == null)
            {
                ThreadStart threadDelegate = new ThreadStart(RealConvert);
                thread = new Thread(threadDelegate);
                thread.Start();
                return "변환을 시작하였습니다.";
            }
            return "이미 변환 작업을 요청하여 수행하고 있는 중입니다."; 
        }
        void RealConvert()
        {
            realconverter.ConvertImage();
            Console.WriteLine("변환 작업을 완료하였습니다.");
            thread = null;
        }
    }
}

 ▶ Program.cs

using System;
using System.Threading;
namespace VirtualProxy
{
    class Program
    {
        static void Main(string[] args)
        {
            VirtualConverter mc = new VirtualConverter();
            VirtualConverter mc2 = new VirtualConverter();
            mc.Image="EVERYDAY IS A HOLIDAY.";
            mc2.Image="WELCOME TO EHCLUB.NET.";
            mc.ConvertImage();
            mc2.ConvertImage();
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine(mc.Image);
                Console.WriteLine(mc2.Image);
                Thread.Sleep(1000);
            }
        }
    }
}
가상 프락시 패턴
가상 프락시 패턴