设计模式结构型-代理模式(Proxy)
Proxy模式也是最常用的设计模式之一。 在java和.net的反射应用,以及大量开源框架反复被使用。重点推荐。
概述
为其他对象提供一种代理以控制对这个对象的访问。
适用性
1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。
2.虚代理(VirtualProxy)根据需要创建开销很大的对象。
3.保护代理(ProtectionProxy)控制对原始对象的访问。
4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。
5.当第一次引用一个持久对象时,将它装入内存。
6.在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它
参与者
1.Proxy
保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。
提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
控制对实体的存取,并可能负责创建和删除它。
其他功能依赖于代理的类型:
2.RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
3.VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问。
4.ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限。
5.Subject
定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
6.RealSubject
定义Proxy所代表的实体。
结构图
示例:(java)
package com.sql9.structured;
abstract class CommonSubject {
public abstract void request();
}
class ActualSubject extends CommonSubject {
public ActualSubject() {
System.out.println("Starting to construct ActualSubject");
try {
// simulate doing some other work on the constructor
Thread.sleep(1000);
System.out.println("Sleeping 1 second finished....");
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Finished constructing ActualSubject");
}
@Override
public void request() {
System.out.println("Executing request in ActualSubject");
}
}
class Proxy extends CommonSubject {
CommonSubject subject;
@Override
public void request() {
if (subject == null) {
subject = new ActualSubject();
}
subject.request();
}
}
public class ProxyTest {
public static void main(String[] args) {
CommonSubject subject = new Proxy();
subject.request();
}
}
结果
Starting to construct ActualSubject
Sleeping 1 second finished....
Finished constructing ActualSubject
Executing request in ActualSubject
补充:软件开发 , Java ,