[設計模式]代理模式

代理模式簡而言之就是A擁有的功能B也有。


 

何時使用

想要訪問一個類別時做一些控制。

舉例說明:

1. 某個化妝品製造商大量生產化妝品並且販售,但消費者並不會直接跟工廠買貨品而是去百貨公司專櫃買。

    則百貨公司專櫃 即為 代理 

2. 想要買最新出版的IPHONE但目前台灣尚未販賣,則需要找代購商購買

   代購商 即為 代理

實例:

音樂鈴工廠生產音樂鈴 (musicBoxProduce) 並且販賣,並在華山 設點 (proxyStore) 販售給消費者。

則販售音樂鈴為一個介面,生產工廠以及華山繼承介面上的動作並且實作。

 

代碼

IsellMusicBox.cs

namespace LearnPattern.ProxyPattern
{
    interface IsellMusicBox
    {
        void sellMusicBox();
    }
}

musicBoxProduce.cs

namespace LearnPattern.ProxyPattern
{
    class musicBoxProduce : IsellMusicBox
    {
        string CustName;
        public musicBoxProduce(string custName)
        {
            CustName = custName;
        }


        public void sellMusicBox()
        {
            Console.Write("sell box to " + CustName);
        }
    }
}

proxyStore.cs

namespace LearnPattern.ProxyPattern
{
    class proxyStore : IsellMusicBox
    {
        musicBoxProduce m;
        public proxyStore(string custName)
        {
            m = new musicBoxProduce(custName);
        }

        public void sellMusicBox()
        {
            m.sellMusicBox();
        }
    }
}

proxyMain.cs


namespace LearnPattern.ProxyPattern
{
    class proxyMain
    {
        static void Main(string[] arg)
        {
            proxyStore p = new proxyStore("77");
            p.sellMusicBox();
            Console.ReadLine();
        }
    }
}

output


當初我以為代理主要是將繁忙的運算代理出來,但其實是顛倒的。

主要是將功能 是為了保護實際物件 讓只有真正需要實作 主要物件時 才使用

已減少系統開銷


參考資料

http://www.runoob.com/design-pattern/proxy-pattern.html

https://segmentfault.com/a/1190000002510537

https://blog.csdn.net/carson_ho/article/details/54910472