代理模式的定义
- 代理模式是指为其他对象提供一个代理,以控制对这个对象的访问
代理模式现实生活场景
- 房产中间
- 婚介所
- 黄牛买票
代理模式的适用场景
- 保护目标对象
- 增强目标对象
静态代理的实现
/**
* 定义一个接口
*/
public interface Person {
void buyCars();
}
/**
* Zhangsan的需求
*/
public class Zhangsan implements Person{
@Override
public void buyCars() {
System.out.println("\n我要买一台2.0t宝马车");
}
}
/**
* 这里相当于一个代理类,代理帮zhangsan看车,买车
*/
public class Zhanglaosan implements Person{
private Zhangsan zhangsan;
public Zhanglaosan(Zhangsan zhangsan) {
this.zhangsan = zhangsan;
}
@Override
public void buyCars() {
System.out.printf("开始去4s店看车");
zhangsan.buyCars();
System.out.println("非常满意,提车!");
}
}
JDK动态代理类实现
/**
* JDK动态代理类 可以同时代理多个对象
*/
public class JdkProxy implements InvocationHandler {
private Person person;
public Person getInstance(Person person){
this.person = person;
Class<?> clazz = person.getClass();
return (Person)Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.printf("开始去4s店看车");
Object object = method.invoke(this.person,args);
System.out.println("非常满意,提车!");
return object;
}
}
– 测试方法
public class Test {
public static void main(String[] args) {
/*Zhanglaosan zhanglaosan = new Zhanglaosan(new Zhangsan());
zhanglaosan.buyCars();*/
JdkProxy jdkProxy = new JdkProxy();
Person person = jdkProxy.getInstance(new Zhangsan());
person.buyCars();
}
}