1. 程式人生 > >Head First設計模式之代理模式

Head First設計模式之代理模式

collect prot indent margin 虛擬代理 ans sig smart ati

一、定義

定義:為其他對象提供一種代理以控制對這個對象的訪問

在代理模式中,我們創建具有現有對象的對象,以便向外界提供功能接口。

二、結構

技術分享

代理模式一般會有三個角色:

  抽象角色(Subject):指代理角色和真實角色對外提供的公共方法,一般為一個接口

  真實角色(RealSubject):需要實現抽象角色接口,定義了真實角色所要實現的業務邏輯,以便供代理角色調用。

  代理角色(Proxy):需要實現抽象角色接口,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。

三、實現

1.靜態代理

namespace DesignPatterns.Proxy
{
    
class Program { static void Main(string[] args) { RealStar star = new RealStar(); Agent agent = new Agent(star); agent.DiscussCooperation(); agent.SignContract(); agent.PlayRoleInMovie(); agent.CollectMoney(); } }
public interface IMovieStar { /// <summary> /// 找電影合作 /// </summary> void DiscussCooperation(); /// <summary> /// 簽合同 /// </summary> void SignContract(); /// <summary> /// 出演電影角色 /// </summary>
void PlayRoleInMovie(); /// <summary> /// 收演出費 /// </summary> void CollectMoney(); } public class RealStar : IMovieStar { public void DiscussCooperation() { Console.WriteLine("星爺找電影合作"); } public void SignContract() { Console.WriteLine("星爺簽合同"); } public void PlayRoleInMovie() { Console.WriteLine("星爺演出"); } public void CollectMoney() { Console.WriteLine("星爺收費"); } } public class Agent : IMovieStar { private IMovieStar _star; public Agent(IMovieStar star) { _star = star; } public void DiscussCooperation() { Console.WriteLine("經紀人找電影合作"); } public void SignContract() { Console.WriteLine("經紀人簽合同"); } public void PlayRoleInMovie() { _star.PlayRoleInMovie(); } public void CollectMoney() { Console.WriteLine("經紀人收費"); } } }

四、使用場景

  按職責來劃分,通常有以下使用場景:

   1、遠程代理。 2、虛擬代理。 3、Copy-on-Write 代理。 4、保護(Protect or Access)代理。 5、Cache代理。 6、防火墻(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

五、優缺點

  優點:

  1、代理模式能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度;

  2、代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了保護目標對象的作用。

  缺點:

  1、由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。

  2、增加了代碼維護的復雜度,實現代理模式需要額外的工作,有些代理模式的實現非常復雜。

歡迎閱讀本系列文章:Head First設計模式之目錄

Head First設計模式之代理模式