目录
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代理:目标对象不实现接口,不用手动添加代理类