一、代理模式的概念
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
二、代理分类
1、静态代理
代理类由程序员创建,程序运行前已经确定了代理类和被代理类的对应关系。
2、动态代理
代理类不由程序员创建,程序运行期间创建代理类对象。
3、cglib代理(暂时不写)
三、代码实现
1、静态代理
1>创建接口
package com.test.proxy;
public interface Subject {
void request();
}
2>创建真实对象实现接口
package com.test.proxy;
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("真实对象-----------");
}
}
3>创建代理对象实现接口
package com.test.proxy;
public class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
System.out.println("begin");
subject.request();
System.out.println("end");
}
}
4>测试类
package com.test.proxy;
public class ProxyTest {
/**
* @param args
*/
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject pSubject = new ProxySubject(realSubject);
pSubject.request();
// ProxyFactory.getIntance().request();
}
}
------------测试结果-----------
begin
真实对象-----------
end
5>创建代理类工厂(使用代理时不用每次都创建代理类对象和真实类对象)
package com.test.proxy;
public class ProxyFactory {
public static Subject getIntance(){
return new ProxySubject(new RealSubject());
}
}
2、动态代理
1>创建接口
package com.test.dynamicproxy;
public interface DynamicProxy {
void request(String str);
}
2>创建真实对象实现接口
package com.test.dynamicproxy;
public class RealObj implements DynamicProxy{
@Override
public void request(String str) {
System.out.println("动态代理真实对象=======" + str);
}
}
3>创建代理对象实现jdk中的InvacationHandler接口
package com.test.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyObj implements InvocationHandler{
private Object target;
public ProxyObj(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("进入代理类---------");
Object object = method.invoke(target, args);
System.out.println("执行完真实类方法之后--------");
return object;
}
/**
* 获取代理对象
* @return
*/
public Object getProxy(){
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(), this);
}
}
4>测试类
package com.test.dynamicproxy;
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
DynamicProxy real = new RealObj();
ProxyObj inHandler = new ProxyObj(real);
DynamicProxy dyProxy = (DynamicProxy) inHandler.getProxy();
dyProxy.request("1111");
}
}
----------测试结果----------
进入代理类---------
动态代理真实对象=======1111
执行完真实类方法之后--------
四、应用场景
1.在原方法执行之前和之后做一些操作,可以用代理来实现(比如记录Log,做事务控制等)。
2. 封装真实的主题类,将真实的业务逻辑隐藏,只暴露给调用者公共的主题接口。