1. 程式人生 > >【設計模式】--代理模式 (Proxy模式)

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

     在軟體系統中,我們無時不在跨越障礙,當我們訪問網路上一臺計算機的資源時,我們正在跨越網路障礙;當我們去訪問伺服器上資料庫時,我們又在跨越資料庫訪問障礙,同時還有網路障礙。跨越這些障礙有時候是非常複雜的,如果我們更多的去關注處理這些障礙問題,可能就會忽視了本來應該關注的業務邏輯問題,Proxy模式有助於我們去解決這些問題。

生活中的例子:

      代理模式提供一箇中介以控制對這個物件的訪問。一張支票存根或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,並提供對簽發人賬號上資金的控制,最終是為了實現支付這個功能。

1.首先,我們以一個簡單的數學計算程式為例,這個程式只負責進行簡單的加減乘除運算:

public class Math      //設計加減乘除四種運算類
{
	public double Add(double x,double y)   
	{
	return x + y;
	}
	public double Sub(double x,double y)
	{
	return x - y;
	}
	public double Mul(double x,double y)
	{
	return x * y;
	}
	public double Dev(double x,double y)
	{
	  return x / y;
	}
}

2.如果這個計算機程式是部署在我們的本地計算機上的,那就十分簡單了,我們也不需要去考慮代理模式了。但是現在如果這個Math類不在本地,而是部署在一臺伺服器上,也就是Math類和客戶端不在同一空間,那麼我們就需要跨越internet這個網路障礙:


3.那如果網路出故障呢?為了解決網路故障的複雜性和不確定性,我們需要一個本地代理MathProxy來替Math類來打點這一切,即為我們引入了一箇中間層,如下圖示意:

4.此時我們已經實現了對Math類的代理,但是還存在一個問題,大多數情況下,我們為了保持對物件操作的透明性,並強制Math類實現MathProxy類要呼叫的所有的方法,我們會讓它們實現與同一個介面。關於強制Math類實現代理類(MathProxy類)所有方法這個問題我也不是很理解,查資料給出最多的解釋是它本身就是針對相同的介面程式設計(兩者有相同的方法),以達到透明地替換原來的物件,而不用修改程式碼。


5.於是我們在Math類和MathProxy類的基礎上加上一層抽象,讓他們都實現IMath介面。

public interface IMath				
{
        double Add(double x,double y);
        double Sub(double x,double y);
        double Mul(double x,double y);
        double Dev(double x,double y);
}
        
        // Math類和MathProxy類分別實現IMath介面:
        public class MathProxy : Imath   //代理類
        {
        //
        }
        public class Math : Imath     //實現類
        {
        //
        }
	// 此時我們在客戶程式中就可以像使用Math類一樣來使用MathProxy類了:
	public class App
	{
	        public static void Main()
	        {
	                      MathProxy proxy = new MathProxy();
	                double addresult = proxy.Add(2,3);
	                double subresult = proxy.Sub(2,3);
	                double mulresult = proxy.Mul(2,3);
	                double devresult = proxy.Dev(2,3);
	        }
	}

       學習完代理模式其實我想到的第一個東西是代理伺服器,原理上有很多相似的地方,什麼是代理伺服器呢?舉個通俗的例子,比如你家的門壞了,不能走出屋子,你只能藉助你家後門並且通過鄰居家的門走出屋子。完成這樣一個目的,就等於說是藉助其他通道到達你想要到達的目的地。
       代理伺服器也一樣,比如本地網路無法直接訪問一些網站或者伺服器,必須通過一個代理點伺服器,那個伺服器和你的本地網路是可以直接ping的通的,然後你就必須設定這個代理伺服器的一些引數,比如ip,埠,然後通過這個平臺連線到其他網路區域。

總結:
     在軟體系統中,增加一箇中間層是我們解決問題的常見手法,這方面Proxy模式給了我們很好的實現。