標籤:c# 設計模式
代理模式(Proxy) 為其他對象提供一種代理以控制對這個對象的訪問。
炎炎夏日即將過去,這個夏天的西瓜,你吃爽了嗎?如果要問夏天有什麼可留戀的?那麼肯定是那冰冰涼涼的冰西瓜!炎熱的夏季裡,抱著半個從冰箱裡剛拿出來的冰鎮西瓜,用勺子挖著吃,是很多人覺得最愜意的吃法。相信大家也都這麼幹過...
今天跟大家聊的不是怎麼吃西瓜,而是在哪裡買西瓜。相信大家都見過路邊的小攤小販拖著一卡車西瓜便宜甩賣的情境吧;大家一般也可以在超市裡買西瓜,但是這些西瓜是從哪裡來的呢?小販種的?超市種的?當然不是,大家接著往下看就明白了...
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Proxy{ //西瓜介面 public interface IWatermelon { //生產西瓜的方法 void product(); //銷售西瓜的方法 void sell(); } //西瓜生產工廠 public class WatermelonFactory :IWatermelon { public void product() { Console.WriteLine("農民伯伯在地裡種出西瓜..."); } public void sell() { Console.WriteLine("農民伯伯銷售西瓜..."); } } //西瓜代理商 public class WatermelonProxy :IWatermelon { //從農民伯伯手裡收購西瓜 private IWatermelon watermelon; public WatermelonProxy (IWatermelon watermelon) { this.watermelon = watermelon; } public void product() { this.watermelon .product (); Console.WriteLine("代理商從農民伯伯手裡收購西瓜..."); } public void sell() { Console.WriteLine("代理商從農民手裡低價收購西瓜,然後以較高的價格銷售,從中賺取一定的價差..."); } } class Program { static void Main(string[] args) { //建立西瓜生產工廠 IWatermelon watermelonFactory = new WatermelonFactory(); //獲得代理對象執行個體 IWatermelon watermelonProxy = new WatermelonProxy(watermelonFactory ); //代理商生產西瓜(其實是農民伯伯種出西瓜) watermelonProxy.product(); //代理商銷售西瓜(低價收購西瓜,然後以較高價格出售,賺取差額利潤) watermelonProxy.sell(); } }}
類圖
代理模式包含如下三個角色:
Subject(抽象角色):聲明真實主題和代理主題的共同介面
RealSubject(真實角色):真正處理請求的目標對象,用戶端可以通過代理角色間接調用真實主題角色中定義的操作。
Proxy(代理角色):代理對象角色內部含有真是對象的引用,從而代理對象可以將請求轉為真實對象處理。 同時,代理對象在執行真實對象操作的前後還可以添加附加操作。
主要優點: 1.能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。
2.用戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改原始碼,符合開閉原則,系統具有較好的靈活性和可擴充性。
主要缺點: 1.由於在用戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,
2.實現代理模式需要額外的工作,而且有些代理模式的實現過程較為複雜。
使用場合: 1.遠程代理(RemoteProxy)為一個對象在不同的地址空間提供局部代理。
2.虛擬代理(VirtualProxy)若一個對象的建立非常耗時,可通過代理對象去調用,在真實對象建立前,返回一個假的調用,等真實對象建立好了,這時返回給用戶端的就是一個真實對象的回應程式法調用。
3.保護代理(ProtectionProxy)控制對原始對象的訪問。
4.智能指引(SmartReference)取代了簡單的指標,它在訪問對象時執行一些附加操作。
相關模式:
裝飾者:裝飾者重點在與添加附加行為修飾被裝飾者。
代理:代理的重點是代替本人作業,減少對實際對象的操作。
設計模式 之 代理