設計模式のProxyPattern(代理模式)----結構模式


一、產生背景

在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

代理模式按照使用目的可以分為以下幾種:

  • 遠程(Remote)代理:為一個位於不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是本電腦中,也可以在另一台電腦中。最典型的例子就是——客戶端調用Web服務或WCF服務。
  • 虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得對象只在需要時才會被真正創建。
  • Copy-on-Write代理:虛擬代理的一種,把復制(或者叫克隆)拖延到只有在客戶端需要時,才真正采取行動。
  • 保護(Protect or Access)代理:控制一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。
  • 防火牆(Firewall)代理:保護目標不讓惡意用戶接近。
  • 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
  • Cache代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以這些結果。

何時使用:想在訪問一個類時做一些控制。

如何解決:增加中間層。

二、一般做法

在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

三、關鍵代碼

class Program
    {
        static void Main(string[] args)
        {
            // 創建一個代理對象並發出請求
            Person proxy = new Friend();
            proxy.BuyProduct();
            Console.Read();
        }

        // 抽象主題角色
        public abstract class Person
        {
            public abstract void BuyProduct();
        }

        //真實主題角色
        public class RealBuyPerson : Person
        {
            public override void BuyProduct()
            {
                Console.WriteLine("幫我買一個IPhone和一台蘋果電腦");
            }
        }

        // 代理角色
        public class Friend : Person
        {
            // 引用真實主題實例
            RealBuyPerson realSubject;

            public override void BuyProduct()
            {
                Console.WriteLine("通過代理類訪問真實實體對象的方法");
                if (realSubject == null)
                {
                    realSubject = new RealBuyPerson();
                }

                this.PreBuyProduct();
                // 調用真實主題方法
                realSubject.BuyProduct();
                this.PostBuyProduct();
            }

            // 代理角色執行的一些操作
            public void PreBuyProduct()
            {
                // 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等
                Console.WriteLine("我怕弄糊塗了,需要列一張清單,張三:要帶相機,李四:要帶Iphone...........");
            }

            // 買完東西之后,代理角色需要針對每位朋友需要的對買來的東西進行分類
            public void PostBuyProduct()
            {
                Console.WriteLine("終於買完了,現在要對東西分一下,相機是張三的;Iphone是李四的..........");
            }
        }

    }

四、設計模式分析

優點: 1、職責清晰。 2、高擴展性。 3、智能化。

缺點: 1、由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。 2、實現代理模式需要額外的工作,有些代理模式的實現非常復雜。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: