一、引言

在软件开发过程中,有些对象有时候会由于网络或者其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象,然后客户端只需要访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,这样的一个解决思路就是今天要介绍的  代理模式(Proxy Pattern)

二、代理模式的详细介绍

代理模式按照使用目的可以分为以下几种:

  • 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象,这个不同的地址空间可以是本电脑中,也可以在另一台电脑中,比如——客户端调用Web服务或者WCF服务。
  • 虚拟(Virtual)代理:根据需要创建一个资源耗大的对象,使得对象只在需要时才会被真正创建。
  • 要时,才真正采取行动。

  • 保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
  • 防火墙(Firewall)代理:保护目标不让恶意用户接近。
  • 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
  • Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。

2.1 定义

代理模式——就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用,在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端与目标对象之间起到中介作用。

2.2代理模式的结构图

2.3模式的组成

  • 抽象主题角色(Subject):声明了真实主题和代理的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题
  • 代理主题角色(Proxy):代理主题角色内部包含有对真实主题的引用,从而可以操作真实对象,代理角色负责在需要的时候创建真实对象,
  • 真实主题角色(RealSubject):定义了代理角色所代表的真实对象。

例如:在WCF或者WebService的开发过程中,我们在客户端添加服务引用的时候,在客户程序中会添加一些额外的类,在客户端生成的类扮演着代理主题角色,我们客户端也是直接调用这些代理角色来访问远程服务提供的操作。这个是远程代理的一个典型例子。

2.4代理模式的代码

Subject类,定义了RealSubject和Proxy的公用接口,这样就在任何使用RealSubject的地方都可以使用Proxy

  public abstract   class Subject
{
public abstract void Request();
}

RealSubject类,定义了Proxy所有代表的真实对象

  public   class RealSubject:Subject
{
public override void Request()
{
Console.WriteLine("真实的对象");
}
}

Proxy类,保持一个引用使得代理可以访问实体,并提供一个与subject的接口相同的接口,这样代理就可以用来替代实体

    public class Proxy:Subject
{
protected RealSubject realsubject;
public override void Request()
{
if (realsubject==null)
{
realsubject = new RealSubject();
}
realsubject.Request();
}
}

客户端调用

   class Program
{
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
}
三、代理模式的优缺点

全面分析完代理模式之后,让我们看看这个模式的优缺点:

优点:

  1. 代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;

  2. 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。

缺点:

  1. 由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢

  2. 实现代理类也需要额外的工作,从而增加了系统的实现复杂度。

C#设计模式系列:代理模式(Proxy Pattren)的更多相关文章

  1. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  2. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

  3. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  4. Java基础-设计模式之-代理模式Proxy

    代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...

  5. [设计模式] 12 代理模式 proxy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...

  6. c#设计模式之代理模式(Proxy Pattern)

    引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...

  7. 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 ...

  8. 设计模式 笔记 代理模式 Proxy

    //---------------------------15/04/21---------------------------- //Proxy 代理模式-----对象结构型模式 /* 1:意图: ...

  9. 【设计模式】—— 代理模式Proxy

    前言:[模式总览]——————————by xingoo 模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理, ...

  10. 结构型设计模式之代理模式(Proxy)

    结构 意图 为其他对象提供一种代理以控制对这个对象的访问. 适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式.下面是一 些可以使用P r o x y 模式常见 ...

随机推荐

  1. django -- 内置分页

    urls.py from django.conf.urls import url from conn_oracle import views urlpatterns = [ url(r'^page/' ...

  2. spring源码解析之AOP原理

    一.准备工作 在这里我先简单记录下如何实现一个aop: AOP:[动态代理] 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 1.导入aop模块:Spring AOP:(s ...

  3. Python与Go选择排序

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 选择排序 # 时间复杂度O(n^2) def selection_sort(array): length ...

  4. java 蓝桥杯基础练习 01字串 进制转换

    问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 请按从小到大的顺序输出这32种01串. 输入格式 本试题没有输入. 输出格式 输出32行,按从小到大的顺 ...

  5. Action的方法访问

    -------------------siwuxie095 Action 的方法访问 Action 的方法访问方式共有三种,如下: 1.通过 method 属性的配置实现 在 action 标签的 m ...

  6. c++ 中介者模式(mediator)

    中介者模式:用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互.中介者模式的例子很多,大到联合国安理会,小到房屋中介.下面以 ...

  7. leetcode BFS解题思路

    Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...

  8. system存储说明和制作os模板时的注意事项

    1.通过ISO制作模板时,安装机器后,使用非持久化磁盘安装后,无法从硬盘引导:使用持久化磁盘可以.2.system 存储,当opennebula 初次部署时,会生成0(system),1(image) ...

  9. 泛型、反射和抽象工厂结合解决多DB问题

  10. Texstudio

    Texstudio快捷键:Ctrl+T,选中之后按这个可以快速注释