首页 > 代码库 > Head First设计模式之代理模式

Head First设计模式之代理模式

一、定义

定义:为其他对象提供一种代理以控制对这个对象的访问

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

二、结构

技术分享

代理模式一般会有三个角色:

  抽象角色(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设计模式之代理模式