代理模式提供了一个中介控制对某个对象的访问。现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理。

1、代理模式简介

1.1>、定义  

  代理模式(Proxy)定义:代理模式为客户端程序提供一种中间层以控制对这个对象的访问。

1.2>、使用频率

   中高

2、代理模式结构

2.1>、结构图

2.2>、参与者

  代理模式参与者:

  ◊ Proxy

    ° 维持一个引用,使得代理可以访问Subject。

    ° 提供一个与Subject的接口相同的接口,这样代理就可以替代Subject。

    ° 控制对Subject的访问,并可能负责对Subject的创建和删除。

  ◊ Subject:定义ConcreteSubject与Proxy的共用接口,从而在任何使用ConcreteSubject的地方都可以使用Proxy。

  ◊ ConcreteSubject:定义Proxy所代表的Subject。

  ◊ Client:维持一个对Subject的引用

  在代理模式中,由于Proxy与ConcreteSubject继承同一接口,所以Client调用ConcreteSubject可以转化为Client调用Proxy在调用ConcreteSubject,类Proxy为中间代理。

3、代理模式结构实现

  Subject.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Structural
{
public abstract class Subject
{
public abstract void Request();
}
}

  ConcreteSubject.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Structural
{
public class ConcreteSubject : Subject
{
public override void Request()
{
Console.WriteLine("Called ConcreteSubject.Request()");
}
}
}

  Proxy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Structural
{
public class Proxy : Subject
{
private ConcreteSubject _concreteSubject; public override void Request()
{
// Use 'lazy initialization'
if (_concreteSubject == null)
{
_concreteSubject = new ConcreteSubject();
} _concreteSubject.Request();
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.ProxyPattern.Structural; namespace DesignPatterns.ProxyPattern
{
class Program
{
static void Main(string[] args)
{
// Create proxy and request a service
Proxy proxy = new Proxy();
proxy.Request();
}
}
}

  运行输出:

Called ConcreteSubject.Request()
请按任意键继续. . .

4、代理模式实践应用

  IMath.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Practical
{
/// <summary>
/// The 'Subject interface
/// </summary>
public interface IMath
{
double Add(double x, double y);
double Sub(double x, double y);
double Mul(double x, double y);
double Div(double x, double y);
}
}

  Math.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Practical
{
/// <summary>
/// The 'ConcreteSubject' class
/// </summary>
public class Math : IMath
{
public double Add(double x, double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
}

  MathProxy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ProxyPattern.Practical
{
public class MathProxy : IMath
{
private Math _math = new Math(); public double Add(double x, double y)
{
return _math.Add(x, y);
} public double Sub(double x, double y)
{
return _math.Sub(x, y);
} public double Mul(double x, double y)
{
return _math.Mul(x, y);
} public double Div(double x, double y)
{
return _math.Div(x, y);
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.ProxyPattern.Practical; namespace DesignPatterns.ProxyPattern
{
class Program
{
static void Main(string[] args)
{
// Create math proxy
MathProxy proxy = new MathProxy(); // Do the math
Console.WriteLine("4 + 2 = " + proxy.Add(, ));
Console.WriteLine("4 - 2 = " + proxy.Sub(, ));
Console.WriteLine("4 * 2 = " + proxy.Mul(, ));
Console.WriteLine("4 / 2 = " + proxy.Div(, ));
}
}
}

  运行输出:

 +  =
- =
* =
/ =
请按任意键继续. . .

5、代理模式应用分析

  代理模式适用范围很广,不同的代理适合于不同的情形。

  ◊ 远程代理为一个对象在不同的地址空间提供局部代表。

  ◊ 虚代理在需要创建开销很大的对象时缓存对象信息。

  ◊ 保护代理控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

  ◊ 智能指引取代了简单指引,它在访问对象时执行了一些附加操作。它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放。当第一次引用一个持久对象时,将它装入内存。在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

  代理模式特点:

  ◊ 代理模式在访问对象时引入一定程度的间接性,可以隐藏对象的位置。

  ◊ 代理模式可以对用户隐藏一种称之为copy-on-write的优化方式。当进行一个开销很大的复制操作的时候,如果复制没有被修改,则代理延迟这一复制过程,这一可以保证只有当这个对象被修改的时候才对它进行复制。

6、代理模式与装饰模式比较分析

  装饰器模式关注于在一个对象上动态的添加方法,代理模式关注于控制对对象的访问。

  装饰器模式中Decorator和ConcreteComponent都实现Component,代理模式中Proxy和ConcreteSubject都实现Subject。使用这两种模式,都可以很容易地在具体对象的方法前面或者后面加上自定义的方法。

  Proxy 可以对Client隐藏对象的具体信息,在使用代理模式时,常在Proxy中创建一个对象的实例。Proxy与ConcreteSubject之间的关系在编译时就能确定。
  在使用装饰模式时,常是将ConcreteComponent对象作为一个参数传给ConcreteDecorator的构造器,Decorator在运行时递归的被构造。

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

  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. 每天一个linux命令--定时启动

    1.设置启动的时间,输入crontab -e命令 设置一种编辑器,进入编辑界面,设置启动的时间为每5分钟启动一次wanghy.sh脚本 # m h dom mon dow command # */ * ...

  2. underscorejs 源码走读笔记

    Underscore 简介 Underscore 是一个JavaScript实用库,提供了类似Prototype.js的一些功能,但是没有继承任何JavaScript内置对象.它弥补了部分jQuery ...

  3. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

  4. 【总结】C# 设置委托的机理和简要步骤

    [引语]实际上,和Winform打交道的第一天呢,我们就已经接触了委托,例如当双击button产生button1_click,这个呢,是对button1点击事件的处理方法,至于委托和订阅事件,就悄悄的 ...

  5. javascript keycode大全

    keycode    8 = BackSpace BackSpacekeycode    9 = Tab Tabkeycode   12 = Clearkeycode   13 = Enterkeyc ...

  6. CSS样式,雪碧,图片替换,渐变小析

    Css基础2: 相对长度单位:em,rem,px,%绝对长度单位:厘米等(不用)颜色单位:rgb,rgb的百分比,16进制(#),颜色名称字体:font-size:为了更好适合点阵,尽量使用偶数fon ...

  7. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  8. Python基本数据类型——str

    字符串常用操作 移除空白 分割 长度 索引 切片 class str(basestring): """ str(object='') -> string Retur ...

  9. JAVA演算法---約瑟夫問題

    1 public class Josephus { public static int[] arrayOfJosephus( int number, int per) { 3 int[] man = ...

  10. 自定义cell右侧 多按钮

    #import "ViewController.h" @interface ViewController () <UITableViewDataSource, UITable ...