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设计模式之目录