Proxy Pattern

目录

1.静态代理

1.1.UML类图

1.2.代码结构

2.动态代理

2.1.UML类图

2.2.代码结构

3.Cglib代理

3.1.UML类图

3.2.代码结构

4.区别与特点


1.静态代理

1.1.UML类图

待补充

1.2.代码结构

package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 出租接口
 */
public interface Renting {
    void sale();
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 房东类
 */
public class Landlord implements Renting{
    @Override
    public void sale() {
        System.out.println("Landlord出售房屋!");
    }
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 中介类
 */
public class LettingAgent implements Renting {
    private Renting target;

    public LettingAgent(Renting target) {
        this.target = target;
    }

    @Override
    public void sale() {
        System.out.println("中介谈价!");
        target.sale();
        System.out.println("交易成功!");
    }
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 模拟场景 => 中介代理出租房屋
 */
public class StaticProxyPattern {
    public static void main(String[] args) {
        Renting target = new Landlord();
        Renting proxy = new LettingAgent(target);
        proxy.sale();
    }
}

2.动态代理

2.1.UML类图

待补充

2.2.代码结构

package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 出租接口
 */
public interface Renting {
    void sale();
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 房东类
 */
public class Landlord implements Renting{
    @Override
    public void sale() {
        System.out.println("Landlord出售房屋!");
    }
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 中介类
 */
public class LettingAgent implements Renting {
    private Renting target;

    public LettingAgent(Renting target) {
        this.target = target;
    }

    @Override
    public void sale() {
        System.out.println("中介谈价!");
        target.sale();
        System.out.println("交易成功!");
    }
}
package com.design.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 模拟场景 => 中介代理出租房屋
 */
public class DynamicProxyPattern {
    public static void main(String[] args) {
        Landlord landlord = new Landlord();
        Renting renting = (Renting) Proxy.newProxyInstance(
            landlord.getClass().getClassLoader(),
            landlord.getClass().getInterfaces(),
            new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("中介谈价!");
                    Object returnValue = method.invoke(landlord, args);
                    System.out.println("交易成功!");
                    return returnValue;
                }
            });
        renting.sale();
    }
}

3.Cglib代理

3.1.UML类图

待补充

3.2.代码结构

package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 房东类
 */
public class Landlord {
    public void sale() {
        System.out.println("Landlord出售房屋!");
    }
}
package com.design.pattern.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 模拟场景 => 中介代理出租房屋
 */
public class CglibProxyFactory implements MethodInterceptor {
    private Object target;

    public CglibProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("中介谈价!");
        Object returnValue = method.invoke(target, args);
        System.out.println("交易成功!");
        return returnValue;
    }
}
package com.design.pattern.proxy;

/**
 * @author Lxz
 * @date 2019/1/19
 * @description 模拟场景 => 中介代理出租房屋
 */
public class CglibProxyPattern {
    public static void main(String[] args) {
        Landlord target = new Landlord();
        Landlord proxy = (Landlord) new CglibProxyFactory(target).getProxyInstance();
        proxy.sale();
    }
}

4.区别与特点

静态代理:目标对象实现接口,需要手动添加代理类

动态代理:目标对象实现接口,不用手动添加代理类

Cglib代理:目标对象不实现接口,不用手动添加代理类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值