代理模式

設計模式—代理模式

前言

開發過程中,有些對象有時候會由於網絡或其他的障礙,以至於不能夠或者不能直接訪問到這些對象,如果直接訪問對象給系統代理不必要的複雜性,這時候可以在客戶單和目標對象直接添加一層中間層,讓代理對象代替目標對象,然後客戶端只訪問代理對象,由代理對象去幫我們去請求目標對象並返回結果給客戶端,即代理模式

代理模式介紹

代理的思路及原理:

 

通過增加代理來解耦a與c之間的調用,這樣可以封裝原理c調用a的一些細節,轉換成c之間調用b中封裝後的代理方法,等同於訪問a.

電腦桌面的快捷方式就是一個代理對象,快捷方式使他所引用的程序的一個代理

1)實際例子

在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由於他朋友不能去國外買東西,他卻可以,所以朋友們都託他幫忙帶一些東西的。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    /// <summary>
    /// 抽象主題角色
    /// </summary>
    public abstract class Person
    {
        public abstract void BuyProduct();
    }
 
    /// <summary>
    /// 真實主題角色
    /// </summary>
    public class RealBuyPerson : Person
    {
        public override void BuyProduct()
        {
            Console.WriteLine("幫我買一個Iphone和一個蘋果電腦");
        }
    }
 
    /// <summary>
    /// 代理角色
    /// </summary>
    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
4
5
6
7
8
9
10
11
static void Main(string[] args)
       {
           //創建一個代理對象併發出請求
           Person proxy = new Friend();
           proxy.BuyProduct();
 
           //使用webservice 調用
           var a = new ServiceReference1.WebService1SoapClient().HelloWorld("my name dd");
           Console.WriteLine(a);
           Console.Read();
       }

 

2)代理模式介紹


抽象主題角色:聲明瞭真實主題和代理主題的公共接口,這樣在使用真實主題的任何地方都可以使用代理主題

代理主題角色:內部包含對真實主題的引用,從而可以操作真實主題對象,代理主題角色負重在需要的時候穿件真實主題對象,代理角色通常在將客戶端調用傳遞到真實主題之前或之後,都要執行一些其他的操作,而不是單純的將調用真實主題對象

真實主題角色:定義了代理角色所代表的真實對象

3)代理模式分析

一般代理類有什麼要求呢?一般來說代理對象必須實現目標對象定義的一些接口,只有這樣,客戶端應用程序在使用的時候,通過接口調用來訪

問目標對象的服務,否則就等於引入複雜度,反而沒有解決問題。

 

使用代理的目的是控制客戶端程序訪問目標對象,因此代理必須知道目標對象的類型及目標對象在哪裏,如何訪問等都必須明確。

 

代理對象有的時候也可以是抽象類型,這樣目標類型就可以是未確定的,我們可以通過創建型模式來動態的創建目標對象,當然前提是這些目標對象

 

是代理對象類型。

優點:代理模式能夠將調用用於真正被調用的對象隔離,在一定程度上降低了系統的耦合度

        在和客戶端和目標對象直接起到中介作用,這樣可以保護目標對象,代理對象可以在對目標對象發出請求之前或之後進行額外的操作例如權限驗證等

缺點:由於中間添加了一個代理對象,所以會造成請求的速度變慢,另外實現代理模式也需要額外的工作,從而增加了系統的實現複雜性

 

5)代理模式和外觀模式的區別

外觀模式也是屏蔽複雜性的,單絲外觀模式不會實現客戶端調用的目標類型接口

一般客戶端調用外觀模式的方法都是直接調用

代理模式中對客戶端目標對象類型抽象接口具體化了

外觀模式是代理模式中一種特殊的子級模式(廣泛的非約束的)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章