首頁 » 設計模式 » 代理(Proxy)

代理(Proxy)

作者:

分類:

代理(Proxy)

概念

代理模式是一種結構型模式,常用在一些需要I/O、網路通訊或是記憶體占用大的物件上,提供一個代理器在物件的讀取前,可以有效減少物件重複讀取的消耗。

比如維基百科的頁面人人都可以查看、編輯,如果一個頁面在每次編輯後都立即產生新網頁,或是一個頁面在每次使用者查詢時都產生新網頁,這每次的產生如果量大起來對於伺服器來說是一個大負擔。

實際上,維基百科會有將資料儲存與網路代理分開(通常流量大的網站也都會這樣做),代理伺服器在每次使用者查詢時,會去確認代理內的網頁是不是最新版本,如果是就直接將頁面提供給使用者,否才會產生新網頁,進而減少伺服器的讀取次數。

範例

//**************
//* author: cian
//* 20231027
//**************

/* base interface */
interface IWikiPage
{
    string GetPageContent();
}

/* Wiki頁面讀取動作 */
class WikiPage : IWikiPage
{
    public string GetPageContent()
    {
    	return LoadPageFromServer();
    }
    
    private string LoadPageFromServer() 
    {
        Console.WriteLine("Load page from server.")
        return "PAGE CONTENT";
    }
}

/* Wiki頁面代理 */
class WikiPageProxy : IWikiPage
{
    string _PageContent = string.empty;
    WikiPage page = new WikiPage();
    
    public string GetPageContent()
    {
    	if(_PageContent == string.empty)
            _PageContent = page.GetPageContent();
    	return _PageContent;
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        IWikiPage page = new WikiPageProxy();
        
        for(int i = 0; i < 100; i++)
        {
            //100次讀取就不需要到伺服器重複載入。
            page.GetPageContent(); 
        }
    }
}

結語

以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *