設計模式-代理模式(Proxy)

簡介:

爲其餘對象提供一種代理以控制對這個對象的訪問。(在訪問真實對象時,引入必定程度的間接性,由於這種間接性能夠附加多種用途)【結構型模式】安全


結構圖:

 


優勢:

  1. 高擴展性;
  2. 代理做爲調用者和真實對象的中間層,下降了模塊間的耦合性。

缺點:

  1. 因爲在客戶端和真實對象之間增長了代理對象,所以有些類型的代理模式可能會形成請求處理的速度變慢;
  2. 實現代理模式須要增長額外的代碼,有些代碼模式的實現可能很複雜。

應用場景:

  1. 遠程代理:爲一個對象在不一樣的地址空間提供局部表明,這樣能夠隱藏這個對象存在於不一樣地址空間的事實;
  2. 安全代理:用來控制真實對象訪問時的權限;
  3. 虛擬代理:在建立一些佔用大量內存或處理複雜的對象時,虛擬代理把這些對象推遲到真正使用它們時建立。對象被應用在第一次引用時建立,並同一個實例被重複使用;
  4. 智能指引:當調用真實對象時,代理能夠作一些其餘的邏輯。

注意事項:

  1. 和裝飾模式的區別:裝飾模式爲了加強功能,代理模式爲了加以控制;
  2. 和適配器模式的區別:適配器模式主要改變所考慮對象的接口,代理模式不能改變所代理類的接口。

示例:

1.結構類圖的實現:ui

ISubject類,定義了RealSubjectProxy的公用接口。在任何使用RealSubject的地方均可以使用Proxythis

RealSubject類,定義Proxy所表明的真實實體。spa

Proxy類,保存一個引用使得代理能夠訪問實體,並提供一個與ISubject的接口相同的接口,這樣代理就能夠用來代替實體。3d

    /// <summary>
    /// 主題
    /// </summary>
    public interface ISubject
    {
        void Request();
    }
    /// <summary>
    /// 真實主題
    /// </summary>
    public class RealSubject : ISubject
    {
        public void Request()
        {
            Console.WriteLine("真實的請求");
        }
    }
    /// <summary>
    /// 代理類
    /// </summary>
    public class Proxy : ISubject
    {
        RealSubject real;
        public void Request()
        {
            if (real == null) real = new RealSubject();
            real.Request();
        }
    }

 客戶端代理

 Proxy proxy = new Proxy();
 proxy.Request();

結果code

2.代理模式之撩妹對象

撩妹的最高境界就是,不用本身親自出馬,找個代理人送花,送巧克力就行。撩妹就是【Subject】,追求者就是【RealSubject】,代理人就是【Proxy】了。blog

美女和撩妹技巧接口

    /// <summary>
    /// 美女
    /// </summary>
    public class Beauty
    {
        public string Name;
        public Beauty(string name)
        {
            Name = name;
        }
    }
    /// <summary>
    /// 撩妹技巧
    /// </summary>
    public interface IChaseGirl
    {
        /// <summary>
        /// 送花
        /// </summary>
        void GiveFlowers();
        /// <summary>
        /// 送巧克力
        /// </summary>
        void GiveChocolate();
    }

 追求者和代理人

    /// <summary>
    /// 追求者
    /// </summary>
    public class Pursuit : IChaseGirl
    {
        private Beauty mm;
        public Pursuit(Beauty mm)
        {
            this.mm = mm;
        }
        public void GiveChocolate()
        {
            Console.WriteLine("送給{0}的巧克力~", mm.Name);
        }
        public void GiveFlowers()
        {
            Console.WriteLine("送給{0}的花~", mm.Name);
        }
    }
    /// <summary>
    /// 代理者
    /// </summary>
    public class Proxy: IChaseGirl
    {
        /// <summary>
        /// 真實追求者
        /// </summary>
        private Pursuit pursuit;
        public Proxy(Beauty mm)
        {
            pursuit = new Pursuit(mm);
        }
        public void GiveChocolate()
        {
            pursuit.GiveChocolate();
        }
        public void GiveFlowers()
        {
            pursuit.GiveFlowers();
        }
    }

客戶端

 Beauty mm = new Beauty("紫霞仙子");
 Proxy proxy = new Proxy(mm);
 proxy.GiveChocolate();
 proxy.GiveFlowers();

結果

話說紫霞仙子最後愛上了誰呢?追求者仍是代理者?固然代理者啦,東西雖然真實的送出者是追求者,但整個過程當中他的面都沒有露過啊。

撩妹都要用代理模式,這難道就是程序猿單身的緣由?

請多多指教~

相關文章
相關標籤/搜索