代理模式-Proxy Pattern

設計模式系列

代理模式:為其他物件提供一種代理,以控制對這個物件的存取

使用時機:如果物件存取時間太長或重複存取次數太頻繁或可能根本不會
                   存取時使用。

用在那些地方:
1.遠程代理:透過不同地址空見的物件提供local的代理物件, EX:WebService
                     、在中間有一個WebReference。

2.虛擬代理:根據建立消耗的大資源物件,先建立一個小物件,等真實角色實
                     例化完成。EX:例如查詢時候,會先用Loading中、等待畫面給客
                     戶看,等載入完成後再實際顯示客戶。

3.保護代理:依照客戶的權限,來控制對真實角色的存取。

4.智能引用:當代理呼叫真實角色時,代理會做其他的功能,比如計算真實角
                     色被呼叫的次數。

5.快取代理:將真實角色的運算結果儲存在臨時的共同空間,多個客戶可以取
                     這些共同的結果。

優點:
1.透過真實角色完成商業邏輯,其他非它的職責代理完成。
2.當真實角色出現商業邏輯變化時,只要Subject的介面不變,Proxy不用修改
    可以正常使用。

缺點:
1.客戶必須透過代理才能請求真實角色做事情,處理速度會變慢。

    class Program
    {
        static void Main(string[] args)
        {
            Proxy proxy = new Proxy();
            proxy.Request();
            Console.ReadKey();
        }
    }

    abstract class Subject
    {
        public abstract void Request();
    }

    class RealSubject:Subject
    {
        public override void Request()
        {
            Console.WriteLine("Called RealSubject.Request()"); 
        }
    }

    class Proxy : Subject
    {
        private RealSubject realSubject;
        public override void Request()
        {
            if (realSubject ==null)
            {
                realSubject = new RealSubject();
            }
            realSubject.Request();
        }
    }

來個案例運算

    public class Program
    {
        private static void Main(string[] args)
        {
            MathProxy proxy = new MathProxy();
            Console.WriteLine($"4 + 2 = {proxy.Add(4,2)}");
            Console.WriteLine($"4 - 2 = {proxy.Sub(4,2)}");
            Console.WriteLine($"4 * 2 = {proxy.Mul(4,2)}");
            Console.WriteLine($"4 / 2 = {proxy.Div(4,2)}");
        }
    }

    public interface IMath
    {
        double Add(double x, double y);

        double Sub(double x, double y);

        double Mul(double x, double y);

        double Div(double x, double y);
    }

    public class Math : IMath
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Sub(double x, double y)
        {
            return x - y;
        }

        public double Mul(double x, double y)
        {
            return x * y;
        }

        public double Div(double x, double y)
        {
            return x / y;
        }
    }

    public class MathProxy : IMath
    {
        private Math math = new Math();

        public double Add(double x, double y)
        {
            return math.Add(x, y);
        }

        public double Sub(double x, double y)
        {
            return math.Sub(x, y);
        }

        public double Mul(double x, double y)
        {
            return math.Mul(x, y);
        }

        public double Div(double x, double y)
        {
            return math.Div(x, y);
        }
    }



老E隨手寫