Head First设计模式之代理模式

简介: 一、定义 定义:为其他对象提供一种代理以控制对这个对象的访问 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 二、结构 代理模式一般会有三个角色:   抽象角色(Subject):指代理角色和真实角色对外提供的公共方法,一般为一个接口   真实角色(RealSubject):需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。

一、定义

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

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

二、结构

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

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

 

相关文章
|
3月前
|
设计模式
设计模式-代理模式
设计模式-代理模式
|
1月前
|
设计模式 JavaScript Java
设计模式——代理模式
一文讲清楚设计模式中的代理模式
21 0
设计模式——代理模式
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
1月前
|
设计模式 uml
设计模式之代理模式
设计模式之代理模式
|
1月前
|
设计模式 Arthas Java
【设计模式】代理模式
【设计模式】代理模式
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式 Dubbo Java
设计模式-代理模式
设计模式-代理模式
31 0
|
3月前
|
设计模式 缓存 安全
聊聊Java设计模式-代理模式
代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
62 1
|
3月前
|
设计模式
设计模式 | 代理模式
设计模式 | 代理模式
13 0
|
3月前
|
设计模式 Go 网络安全
Golang设计模式——21代理模式
Golang设计模式——21代理模式
23 0