代理设计模式

代理模式分为两种:

    1、静态代理

    2、动态代理

                    1)jdk实现的动态代理

       2)cglib实现的动态代理

代理模式的核心组件:代理对象,目标对象

静态代理:

       优点:扩展以及重用目标对象的功能!

       缺点:代理对象和目标对象的关系,编译前已经确定,如果代理模式中的接口功能出变动,代理对象和目标对象都需要进行维护

关系图:

静态代理模式的实现步骤:

 1、创建接口

 2、创建代理类并实现 第一步创建的接口

     2.1)通过构造函数传入的接口对象,调用目标对象方法接建立代理对象和目标对象的关系

 3、创建目标类并实现 第一步创建的接口


创建接口:

public interface ProxyInterface {
    //找工作
    String lookForJob();
}

创建代理类并实现接口:

public class ProxyObject implements ProxyInterface {

    private ProxyInterface  proxyInterface;

    public ProxyObject(ProxyInterface proxyInterface) {
        this.proxyInterface = proxyInterface;
    }

    @Override
    public String lookForJob() {
        //如果返回的是1,则表示通过智联没有找到工作,返回2则表示找到工作
        String s = proxyInterface.lookForJob();
        //如果通过智联没有找到工作,则使用boss继续找工作
        if (s.equals("1")) {
            System.out.println("通过boss找工作");
            return "2";
        }
        return s;
    }
}

创建目标类并实现接口:

public class TargetObject implements ProxyInterface{
    @Override
    public String lookForJob() {
        System.out.println("通过智联找工作");
        return "1";
    }
}

客户端调用:

public class ProxyTest {

    public static void proxyClient(ProxyInterface proxyInterface){
        proxyInterface.lookForJob();
    }

    public static void main(String[] args) {
        proxyClient(new ProxyObject(new TargetObject()));
    }
}

动态代理:

   优点:扩展,复用

   缺点:复杂不易理解,代码重复,(jdk动态代理必须实现接口)

jdk动态代理核心组件:Proxy类,invocationhandler接口

动态代理实现步骤:

 1、创建接口

 2、创建目标类并实现接口

 3、创建代理类,并实现invocationhandler接口

创建接口:

public interface DynamicInterface {

    String lookForJob();
}

创建目标类并实现接口:

public class DynamicTargetObject implements DynamicInterface {
    @Override
    public String lookForJob() {
        System.out.println("智联找工作");
        return "1";
    }
}

创建代理类,并实现invocationhandler接口:

public class DynamicProxyObject implements InvocationHandler {

    private Object object;

    public DynamicProxyObject(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object,args);
    }
}

调用:

public class DynamicProxyTest {

    public static void dynamicProxyClient(DynamicInterface dynamicInterface){
        //如果返回的是1,则表示通过智联没有找到工作,返回2则表示找到工作
        String s = dynamicInterface.lookForJob();
        //如果通过智联没有找到工作,则使用boss继续找工作
        if (s.equals("1")) {
            System.out.println("通过boss找工作");
        }
    }

    public static void main(String[] args) {
        DynamicTargetObject dynamicTargetObject = new DynamicTargetObject();
        Object o = Proxy.newProxyInstance(dynamicTargetObject.getClass().getClassLoader(),
                dynamicTargetObject.getClass().getInterfaces(),
                new DynamicProxyObject(dynamicTargetObject));
        dynamicProxyClient((DynamicInterface) o);
    }
}

     

原文地址:https://www.cnblogs.com/shiguotao-com/p/10137232.html