您的位置:首页 > 其它

设计模式(十一)之Proxy - 代理模式

2010-02-09 14:11 260 查看
Proxy代
理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些
原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时
加上一个对此对象的访问层。如下图:



比如说
C

A
不在一个服务器上,
A
要频繁的调用
C
,我们可以在
A
上做一个代理类
Proxy
,把访问
C
的工作交给
Proxy
,这样对于
A
来说,就好像在直接访问
C
的对象。在对
A
的开发中我们可以把注意力完全放在业务的实现上。

GoF
《设计模式》中说道:为其他对象提供一种代理以控制这个对象的访问。

Proxy
模式的结构:



下面通过一个场景来看看
Proxy
的实现,我们要使用代理类型
ProxyClass
的对象调用远程机器上的一个类型
LongDistanceClass
的对象。

首先我们先模拟一个远程的类型:为了保持对被代理对象使用的透明性,我们使代理类型和被代理类型同时继承同一个接口IProxy

接口实现:

interface
IProxy

{

string
Function1();

string
Function2();

}

远程对象实现:

///

<summary>

///

模拟的远程对象

///

</summary>

public
class
LongDistanceClass:IProxy

{

#region
IProxy
成员

public
string
Function1()

{

//do someting

return
"LongDistanceClass.Function1"
;

}

public
string
Function2()

{

//do someting

return
"LongDistanceClass.Function2"
;

}

#endregion

}

接下来就要实现代理类型,使用代理对象访问模拟的远程对象,代理类型实现如下:

public
class
ProxyClass:IProxy

{

#region
IProxy
成员

public
string
Function1()

{

//to access LongDistanceClass.Function1

LongDistanceClass obj = new
LongDistanceClass();

return
obj.Function1();

}

public
string
Function2()

{

//to access LongDistanceClass.Function2

LongDistanceClass obj = new
LongDistanceClass();

return
obj.Function2();

}

#endregion

}

最后实现客户端代码:

class
Class1

{

[STAThread]

static
void
Main(string
[] args)

{

IProxy pro = new
ProxyClass();

Console.WriteLine(pro.Function1());

Console.WriteLine(pro.Function2());

Console.Read();

}

}

运行结果如下:

LongDistanceClass.Function1

LongDistanceClass.Function2

Proxy
模式的要点:

1
、“增加一层间接层”是软件系统中对许多负责问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的
proxy
对象便是解决这一问题的常用手段。

在我们日常的工作中也常常用到代理模式,比如对于三层结构或者
N-

tiers
结构中
DAL
数据访问层,它把对数据库的访问进行封装。
BLL
业务层的开发者只是调用
DAL
中的方法来获得数据。

在比如前一段时间看了看
AOP

Remoting
方面的资料,对于跨越应用程序域的访问,要为客户应用程序提供一个
TransparentProxy
(透明代理),客户程序实际上是通过访问这个代理来访问实际的类型对象。

2
、具体
proxy
设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象作细粒度的控制,有些可能对组件模块提供抽象代理层,在架构层次对对象作
proxy


3

proxy
并不一定要求保持接口的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。例如上面的那个例子,代理类型
ProxyClass
和被代理类型
LongDistanceClass
可以不用继承自同一个接口,正像
GoF
《设计模式》中说的:为其他对象提供一种代理以控制这个对象的访问。代理类型从某种角度上讲也可以起到控制被代理类型的访问的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: