設計模式:
代理模式(Proxy Pattern)
簡單介紹:
代理模式(Proxy Pattern):
當無法直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問,為了保證客戶端使用的透明性,所訪問的真實對象與代理對象需要實現相同的接口。根據代理模式的使用目的不同,代理模式又可以分為多種類型,例如保護代理、遠程代理、虛擬代理、緩沖代理等,它們應用於不同的場合,滿足用戶的不同需求。
用戶------>代理------->對象
生活中其實也有許多的例子比如買一部手機,國內購買比較貴,因為涉及到上稅的問題,所以好多人從香港或者美國等其他地方代購,
客戶----->代購------->香港
大概就是這么個意思。
代理模式主要組成部分:
Proxy 維持一個引用,使得代理可以訪問Subject。
提供一個與Subject的接口相同的接口,這樣代理就可以替代Subject。
控制對Subject的訪問,並可能負責對Subject的創建和刪除。
Subject:定義ConcreteSubject與Proxy的共用接口,從而在任何使用ConcreteSubject的地方都可以使用Proxy。
ConcreteSubject:定義Proxy所代表的Subject。
Client:維持一個對Subject的引用
在代理模式中,由於Proxy與ConcreteSubject繼承同一接口,所以Client調用ConcreteSubject可以轉化為Client調用Proxy在調用ConcreteSubject,類Proxy為中間代理。
代理模式類圖:
代理模式C#代碼舉例:
Subject類 對外提供的接口類
1 /// <summary> 2 /// 代理類和對象的共用接口 3 /// </summary> 4 public abstract class Subject 5 { 6 public abstract void Print(); 7 }
ConcreteSubject類代理類所創建代表的對象
1 /// <summary> 2 /// 代理類所創建的對象 3 /// </summary> 4 public class ConcreteSubject :Subject 5 { 6 public override void Print() 7 { 8 Console.WriteLine("ConcreteSubject"); 9 } 10 }
Proxy代理類
1 /// <summary> 2 /// 代理類 3 /// </summary> 4 public class Proxy : Subject 5 { 6 private ConcreteSubject _concreteSubject; 7 public override void Print() 8 { 9 if (_concreteSubject == null) 10 { 11 _concreteSubject = new ConcreteSubject(); 12 } 13 _concreteSubject.Print(); 14 } 15 }
用戶測試類:
1 /// <summary> 2 /// 客戶端測試類 3 /// </summary> 4 class Client 5 { 6 static void Main(string[] args) 7 { 8 //創建代理類 9 Proxy proxy = new Proxy(); 10 proxy.Print(); 11 Console.Read(); 12 } 13 }
運行結果:
代理模式源代碼工程文件下載
代理模式生活例子舉例:
生活中其實也有許多的例子比如買一部手機,國內購買比較貴,因為涉及到上稅的問題,所以好多人從香港或者美國等其他地方代購,
客戶----->代購------->香港
類圖:
代理模式生活例子C#代碼舉例:
Subject類 :對外接口類
1 /// <summary> 2 /// 對象接口 3 /// </summary> 4 public abstract class Subject 5 { 6 public abstract void Print(); 7 }
MobilePhone類 具體手機類
1 /// <summary> 2 /// 手機類 3 /// </summary> 4 public class MobilePhone : Subject 5 { public override void Print() 6 { 7 Console.WriteLine("我是一部蘋果手機!"); 8 } 9 }
MobilePhoneProxy類 手機代理類
1 /// <summary> 2 /// 手機代理類 3 /// </summary> 4 public class MobilePhoneProxy :Subject 5 { 6 private MobilePhone mobilePhone =null; 7 8 public override void Print() 9 { 10 if (mobilePhone == null) 11 { 12 mobilePhone = new MobilePhone(); 13 } 14 mobilePhone.Print(); 15 } 16 }
用戶測試類
1 /// <summary> 2 /// 客戶端調用測試類 3 /// </summary> 4 class Client 5 { 6 static void Main(string[] args) 7 { 8 //創建代理類既可以拿到手機 9 MobilePhoneProxy mobilePhoneProxy = new MobilePhoneProxy(); 10 mobilePhoneProxy.Print(); 11 Console.Read(); 12 } 13 }
運行結果
代理模式生活實例C#代碼工程文件下載