代理模式:
代理模式(Proxy):為其他物件提供一種代理以控制對這個物件的訪問。
UML結構如下圖:
程式碼實現:
//定義一個Subject 抽象類 public abstract class Subject { public abstract void Request(); } //定義一個RealSubject類,繼承Subject public class RealSubject : Subject { public override void Request() { Console.WriteLine("Called RealSubject.Request()"); } } //定義一個代理Prxoy類,繼承Subject public class Proxy : Subject { private RealSubject realSubject; public override void Request() { if (realSubject == null) { realSubject = new RealSubject(); } realSubject.Request(); } } class Program { static void Main(string[] args) { //例項化代理類 Proxy proxy = new Proxy(); //通過代理類來訪問請求 proxy.Request(); Console.ReadKey(); } }
例項程式碼:
public interface IMath { double Add(double x, double y); double Sub(double x, double y); double Mul(double x, double y); double Div(double x, double y); } public class Math : IMath { 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 Div(double x, double y) { return x / y; } } public class MathProxy : IMath { private Math _math = new Math(); public double Add(double x, double y) { return _math.Add(x, y); } public double Sub(double x, double y) { return _math.Sub(x, y); } public double Mul(double x, double y) { return _math.Mul(x, y); } public double Div(double x, double y) { return _math.Div(x, y); } } class Program { static void Main(string[] args) { //建立一個計算代理 MathProxy proxy = new MathProxy(); Console.WriteLine("4 + 2 = " + proxy.Add(4, 2)); Console.WriteLine("4 - 2 = " + proxy.Sub(4, 2)); Console.WriteLine("4 * 2 = " + proxy.Mul(4, 2)); Console.WriteLine("4 / 2 = " + proxy.Div(4, 2)); Console.ReadKey(); } }
執行結果:
代理模式應用
1、遠端代理:為一個位於不同的地址空間的物件提供一個局域代表物件。這個不同的地址空間可以是在本機器中,也可是在另一臺機器中。如 WebService,WCF 在.net 中的呼叫。
2、虛擬代理:根據需要建立一個資源消耗較大的物件,使得此物件只在需要時才會被真正建立。如瀏覽一個複雜html頁面,有很多圖片和文字,但還是可以很快開啟,可以看到所有的文字,此時看到的圖片卻是一張一張下載後才能看到,瀏覽器就是利用代理模式來優化下載的。
3、安全代理:用來控制真實物件訪問時的許可權,一般用於物件應該有不同的訪問許可權。
4、智慧指引:是指當呼叫真實的物件時,代理處理另外一些事。比如將對此物件呼叫的次數記錄下來。