为其他对象提供一种代理以控制对这个对象的访问。
专人做专事,为了代码的解耦。
应用:AOP、拦截器、jdbc、猎头、房屋中介、媒婆等等。
一、静态代理
1、接口:
public interface Person {
public void findLove();
}
2、被代理类:
public class Son implements Person {
@Override
public void findLove(){
System.out.println("适龄,投缘的");
}
}
3、代理类 :
public class Father {
private Person person;
public Father(Person person){
this.person=person;
}
public void findLove(){
System.out.println("根据儿子的要求物色");
this.person.findLove();
System.out.println("女方意见。。。");
}
}
4、测试:
public class App
{
public static void main( String[] args )
{
Father father = new Father(new Son());
father.findLove();
}
}
5、输出:
根据儿子的要求物色
适龄,投缘的
女方意见。。。
6、缺点:
在代理前,所以的东西都是已知的,不易拓展。每新增一个被代方法。所以的类都要修改代码。
二、动态代理1:
1、接口。
public interface Person {
public void findLove();
public void findJob();
}
2、被代理类:
public class Son implements Person {
@Override
public void findLove(){
System.out.println("适龄,投缘的");
}
@Override
public void findJob() {
System.out.println("合适的,工作");
}
}
3、代理类:
婚介所代理
public class JDKProxy implements InvocationHandler {
private Son target;
public Object getInstance(Son target){
this.target = target;
Class> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("取到要求,开始物色");
method.invoke(this.target,args);
System.out.println("合适的话,开始相处");
return null;
}
}
找工作代理。
public class JDK51Jop implements InvocationHandler {
private Son target;
public Object getInstance(Son target){
this.target = target;
Class> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("取到简历,投递合适的工作");
method.invoke(this.target,args);
System.out.println("安排面试。");
return null;
}
}
4、测试
public class App
{
public static void main( String[] args )
{
Person love = (Person)new JDKProxy().getInstance(new Son());
love.findLove();
System.out.println("-------------------------------------------------------------------");
Person job = (Person)new JDK51Jop().getInstance(new Son());
job.findJob();
}
}
输出:
取到要求,开始物色
适龄,投缘的
合适的话,开始相处
-------------------------------------------------------------------
取到简历,投递合适的工作
合适的,工作
安排面试。
三、动态代理:通过cglib实现
1、导入cglib的包
cglib
cglib
3.2.5
2、被代理类
public class ZhangSan {
public void findHouse(){
System.out.println("距离,价格");
}
}
3、代理类
public class CglibProxy implements MethodInterceptor {
public Object getInstance(Class> clazz){
Enhancer enhancer = new Enhancer();
//设置为新类的父类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("拿到需求");
methodProxy.invokeSuper(o,objects);
System.out.println("找到房源,准备办理手续");
return null;
}
}
4、测试
public class App
{
public static void main( String[] args )
{
ZhangSan obj = (ZhangSan)new CglibProxy().getInstance(ZhangSan.class);
obj.findHouse();
}
}
输出:
拿到需求
距离,价格
找到房源,准备办理手续。