代理模式的原理(静态/动态)
代理实现:
1.静态代理:
带理者只能实现一种被代理的需求
2.动态代理:
<1>可以实现针对被代理需求的多种代理
<2>需要实现 InvocationHandler接口
<3>利用反射传入的类加载器 来改变代理方法 动态传入代理加载类
一、静态代理模式
//如下实现对静态代理的测试
public class TestProxy {
`@Test
public void testStaticProxy() {
ProxyImpl im = new ProxyImpl();
Proxy2 p2=new Proxy2();
PersonProxy pp = new PersonProxy(p2);
pp.action();
}
}
//代理和被代理都实现的共同接口如下:
interface Person{
void action();
}
//代理者类实现如下:
class PersonProxy implements Person{
Person p;
public PersonProxy(Person p){
this.p=p;//将 顾客(被代理人)的资料告诉代理人
}
@Override
public void action() {
System.out.println("开始代理工作");
p.action();//执行 顾客要求的代理工作
System.out.println("结束代理工作");
}
}
//被代理者1——买车实现如下:
class ProxyImpl implements Person{
@Override
public void action() {
System.out.println("我要买" +"车");
}
}
//被代理类2代理买房实现如下:
class Proxy2 implements Person{
@Override
public void action() {
System.out.println("我要买房……");
}
}
二、动态代理实现如下:
测试代理方法:
//测试代理运行 模块如下:
`@Test
public void testDynamicProxy() {
Person person = new Customer1();
/**
* 参数1: 代理人对象使用的类加载器 参数2:代理人对象 实现的接口 参数3: 被代理人对象
*
* */
Person p = (Person) Proxy.newProxyInstance(person.getClass()
.getClassLoader(), person.getClass().getInterfaces(),
new Clerk(person));
p.doWork();
}
}
// 包含所有代理类的工厂(类似于中介可代理多种买车 买房 ……)
class Clerk implements InvocationHandler {
Person person;// 被代理人
public Clerk(Person person) {
this.person = person;
}
/**
* 参数1:被代理对象 参数 2:被代理对象要代理的业务——买房或买车 参数 3:被代理对象要执行的方法的对应参数
*
* 返回:代理人对象
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("-----开始代理工作------");
Object invoke = method.invoke(person, args);
System.out.println("-----结束代理工作-------");
return invoke;
}
}
//共同实现的接口
interface Person {
void doWork();
}
//被代理对象1
class Customer1 implements Person {
@Override
public void doWork() {
System.out.println("我要买车");
}
}
//被代理对象2
class Customer implements Person {
@Override
public void doWork() {
System.out.println("我要买房");
}
}