第1页共13页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共13页描述:让我们思考一下下面的代码://Client1
classCustomer{2
publicvoidsomeMethod(){3
//CreatetheServiceProviderInstance4
FileUtilfutilObj=newFileUtil();5
//AccesstheService6
futilObj
writeToFile(“SomeData”);7
}作为它实现的一部分,Customer类创建了一个FileUtil类的一个实例并且直接访问它的服务
换句话说,对于客户对象,访问FileUtil对象的方式是很直接的
它的实现可能是客户对象访问服务提供者对象最为普通的方式了
相比较,有些时候客户对象可能不直接访问服务提供者(也就是指目标对象),这种情况是由于下面的原因导致的:(1)目标对象的位置
目标对象可能存在于同一台或者不同机器的不同地址空间
(2)目标对象的存在形式
目标对象可能直到他被请求服务的时候还不存在,或者对象被压缩
第2页共13页第1页共13页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共13页(3)特殊的行为
目标对象可以根据客户对象的访问权限接受或拒绝服务
在多线程环境,一些服务提供者对象需要特殊的考虑
在这些情况下,代理模式(ProxyPattern)建议不要使有特殊需求的客户对象直接访问目标对象,而是使用一个单独的(分离的)对象(也就是指代理对象)为不同的客户提供通常的、直接的访问目标对象的方式
代理对象提供和目标对象一样的接口
代理对象负责与目标对象交互的细节,代表客户对象与目标对象交互
所以客户对象不再需要处理访问目标对象的服务时的特殊需求
客户对象通过它的接口调用代理对象,代理对象直接把这