代理模式(Proxy )

 为其他对象提供一种代理以控制对这个对象的访问。

专人做专事,为了代码的解耦。

应用: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的包

    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.2.5</version>
    </dependency>

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();
    }
}

输出:

拿到需求
距离,价格
找到房源,准备办理手续。

猜你喜欢

转载自blog.csdn.net/ChenAi12345678910/article/details/81358804
今日推荐