【大話設計模式】——代理模式

ZeroWM發表於2014-06-01

一、概念

  現實生活中,我們每個人的能力是有限的,總有一些事情讓我們束手無策,我們就可以找別人來幫忙,幫我們的這個人稱之為代理。下面讓我們看一下代理模式的概念:

  代理模式(Proxy):為其他物件提供一種代理以控制對這個物件的訪問。


二、UML圖

Subject(抽象角色):定義了RealSubject和Proxy的共用介面,這樣就在任何使用RealSubject的地方都可以使用Proxy.

RealSubject(真實角色):定義了Proxy所代表的真實實體。

Proxy(代理角色):儲存了一個引用使得代理可以訪問實體,並提供一個與Subject的介面相同的介面,這樣代理就可以用來代替實體。


RealSubject和Proxy都繼承了Subject抽象類的方法,Proxy和RealSubject的關係是關聯關係。體現在程式碼上,RealSubject類中書寫具體的方法,Proxy去呼叫RealSubject中的方法。Proxy和RealSubject共同實現Subject的介面。



三、例項解析

  有的時候,一些突發事件蹦出來想要打亂了我們的計劃,卻又正好趕上我們有更加重要的事情要親自去做,那這件緊急不重要的事情怎麼辦呢?如果可以的話,讓別人代替我們完成。

  這就要用到我們的代理了,XX去幫我打個水吧,XX去幫我取個快遞吧~


下面是應用了代理模式的程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Proxy p=new Proxy ();
            p.BringWater();
            p.BringPackage();
            Console .Read ();
        }

    }
    //定義了Roommates和Proxy的公用介面
    abstract class Working
    {
        public abstract void BringWater();
        public abstract void BringPackage();
    }

    //讓代理去實現幹活的介面,定義了Proxy所代表的真實實體。
    class Roommates : Working 
    {
       
        public override void BringWater()
        {
            Console.WriteLine("兄弟,幫我打水吧!");
        }
        public override void BringPackage()
        {
            Console.WriteLine("兄弟,幫我取快遞吧!");
        }
    }

    //保持一個引用使得代理可以訪問實體,並提供一個與Working的介面相同的介面,這樣代理就可以用來替代實體。
    class Proxy:Working 
    {
        Roommates r;
        public override void BringWater()
        {
            if (r == null)
            {
                r = new Roommates();
            }
            r.BringWater();           
        }

        public override void BringPackage()
        {
            if (r == null)
            {
                r = new Roommates();
            }
            r.BringPackage();
        }
    }
}

執行結果:



四、總結

代理模式應用:

1.  遠端代理,也就是為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實。

2.  虛擬代理,根據需要建立開銷很大的物件。通過它來存放例項化需要很長時間的真實物件。

3.  安全代理,用來控制真實物件訪問的許可權。

4.  智慧指引,指當呼叫真實物件時,代理處理另外一些事。


 本質:通過使用引用物件來訪問真實物件,在這裡代理物件充當用於客戶端和真實物件的中介者。 


個人理解:根據愛因斯坦的相對性,凡事有利必有弊,做事要有度。代理模式運用的好就可以節省記憶體,保障了使用者安全,方便排程。運用的不好,就成了九曲十八彎,費力不討好。不過相信一點,存在必合理,雖然現在我們只能對它有一個初步的瞭解,不怕不知道,就怕不知道,總有一天會有它的用武之地!

 



相關文章