代理模式是一种结构型模式,分为静态代理和动态代理。
- 静态代理是指由程序员手工创建代理对象;
- 动态代理是指代理对象是程序在运行过程中采用反射机制动态创建的。
代理模式能够解决哪些问题?
- 控制客户端对真实对象的访问
- 对被代理对象添加额外的功能,即功能增强。
代理模式使用场景有哪些?
- 远程代理
- 虚拟代理
- 保护代理
静态代理的示例代码如下:
public interface Subject {
public void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("this is RealSubject");
}
}
public class StaticProxy implements Subject{
private Subject target;
public StaticProxy(Subject target){
this.target=target;
}
@Override
public void request() {
before();
target.request();
after();
}
public void before(){
System.out.println("前置操作");
}
public void after(){
System.out.println("后置操作");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
Subject sub=new RealSubject();
StaticProxy staticProxy=new StaticProxy(sub);
staticProxy.request();
}
}
动态代理的代码示例如下:
public class DynamicProxy implements InvocationHandler {
private Subject target;
public Object getInstance(Subject target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object obj=method.invoke(this.target,args);
after();
return obj;
}
public void before(){
System.out.println("dynamic proxy before");
}
public void after(){
System.out.println("dynamic proxy after");
}
}
public class DynamicProxyTest {
public static void main(String[] args) throws Exception {
Subject subject=new RealSubject();
Subject subProxy=(Subject)new DynamicProxy().getInstance(subject);
subProxy.request();
byte[] bytes= ProxyGenerator.generateProxyClass("$Proxy0",new Class[]{Subject.class});
FileOutputStream fos=new FileOutputStream("D://$Proxy0.class");
fos.write(bytes);
fos.close();
}
}