【設計模式】--代理模式 (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類來打點這一切,即為我們引入了一箇中間層,如下圖示意:
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模式給了我們很好的實現。