代理模式(Proxy),爲其餘對象提供一種代理以控制對這個對象的訪問。javascript
在某些狀況下,一個對象不適合或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。html
代理模式的優勢:java
(1)、職責清晰,真實的角色就是實現實際的業務邏輯,不用關心其餘非本職責的事務,經過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
(2)、代理對象能夠在客戶端和目標對象之間起到中介的做用,這樣起到了的做用和保護了目標對象的做用。
(3)、高擴展性git
代理模式的UML圖:編程
代碼示例:設計模式
namespace ConsoleApplication1 { abstract class Subject { public abstract void Request(); } class RealSubject : Subject { public override void Request() { Console.WriteLine("真實的請求!"); } } //代理類 class Proxy : Subject { 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(); } } }
從代碼來看,代理模式的思想是很簡單的,難度應該在怎麼靈活應用上。安全
namespace 代理模式 { class Program { static void Main(string[] args) { 小夫 proxy = new 小夫(); proxy.Hit(); //輸出真實的請求 Console.ReadKey(); } } abstract class Subject { public abstract void Hit(); } class 胖虎 : Subject { public override void Hit() { Console.WriteLine("揍大雄!"); //Type t = this.GetType(); //Console.WriteLine("揍大雄的人是:" + t.Name); } } //代理類 class 小夫 : Subject { 胖虎 realSubject; //把胖虎放到小夫家 public override void Hit() { if (realSubject == null) { realSubject = new 胖虎(); //胖虎來了 } realSubject.Hit(); //讓胖虎揍大雄 } } }
典型的應用場景是,當真正的處理類不方便使用時,就能夠使用代理模式。ide