代理模式:

代理模式:

1.静态代理

2.动态代理

  • 动态代理和静态代理角色一样

  • 动态代理的代理类是动态生成的,不是我们直接写好的

  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    • 基于接口—-JDK动态代理

    • 基于类:cglib

    • java字节码实现:javasist

      需要了解两个类:Proxy,InvocationHandler:调用处理程序

InvocationHandler

3.实现过程

3.1.接口Rent:

1
2
3
4
public interface Rent {

public void rent();
}

3.2.Rent的实现类:

1
2
3
4
5
6
7
public class Host implements Rent {

@Override
public void rent() {
System.out.println("房东要出租房子");
}
}

3.3.动态生成代理类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ProxyInvocationHandler implements InvocationHandler {

//被代理的接口
private Rent rent;
//setter注入
public void setRent(Rent rent) {
this.rent = rent;
}

//生成代理对象
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this);
}


//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
//动态代理的本质就是使用反射来实现
Object result = method.invoke(rent, args);//运行rent方法,参数列表为args
fare();

return result;
}

public void seeHouse(){
System.out.println("中介带看房子");
}
public void fare(){
System.out.println("收中介费");
}
}

3.4.main方法:

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
//真实角色
Host host = new Host();

//代理角色:现在没有
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//通过调用程序来处理角色来处理我们要调用的接口对象!
pih.setRent(host);
Rent proxy = (Rent)pih.getProxy();//这里的proxy就是动态生成的,我们并没写
proxy.rent();
}