代理模式
一.概念
代理模式就是AOP面向切面编程的底层原理,在不影响真实角色的情况下,代理角色为真实角色添加其他的功能。
二.分类
1.静态代理
2.动态代理
三.共有的角色说明
1.抽象角色:一般会使用接口或者抽象类来解决。
2.真实角色:被代理的角色;(实现抽象角色);
3.代理角色:代理真实角色:(实现抽象角色的条件下额外添加部分功能);
4.客户角色:访问代理角色的人
实例(租房)
1.抽象角色:租房
2.真实角色:房东
3.代理角色:中介
4.客户角色:自己
四.静态代理
1.抽象角色(租房)
public interface Rent {
void rent();
}
2.真实角色(房东)
public class Host implements Rent{
@Override
public void rent() {
System.out.println("我要把房子租出去");
}
}
3.代理角色(中介)
将真实角色添加进来,添加额外功能
public class Proxy implements Rent{
private Host host;
public void setHost(Host host) {
this.host = host;
}
@Override
public void rent() {
seeHouse();
host.rent();
contract();
}
//看房子
public void seeHouse(){
System.out.println("看房子");
}
//签合同
public void contract(){
System.out.println("签合同");
}
}
4.客户角色(客户)
public class Client {
public static void main(String[] args) {
Host h=new Host();
//代理对象帮房东租房子,客户不用找房东,而是直接找中介
Proxy p=new Proxy();
p.setHost(h);
p.rent();
}
}
代码运行结果
看房子
我要把房子租出去
签合同
静态代理缺点:一个真实角色有一个代理角色,代码会翻倍,开发效率会降低很多。
五.动态代理
介绍:
1.动态代理的本质就是使用的反射机制来实现的;
2.需要掌握两个类:
2.1Proxy;代理类
2.2InvocationHandler:调用处理程序invoke()方法返回处理结果;
3.动态代理和静态代理一样,动态代理的代理类是动态生成的,不是自己写的,动态代理分为两大类,
3.1基于接口的动态代理,接口:JDK动态代理
3.2基于cglib java字节码实现javasist
1.抽象角色(租房)
public interface Rent {
void rent();
}
2.真实角色(房东)
public class Host implements Rent{
@Override
public void rent() {
System.out.println("我要把房子租出去");
}
}
3.代理角色(中介)
该类是动态代理的工具类
public class ProxyInvocationHandler implements InvocationHandler{
private Object b;
//将真实角色注入到动态代理角色中
public void setRent(Object b){
this.b=b;
}
//生成动态代理类
public Object getProxy(){
Object ob=Proxy.newProxyInstance(this.getClass().getClassLoader(),
b.getClass().getInterfaces(),this);
return ob;
}
//处理代理实例并返回处理结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
Object obj=method.invoke(b,args);
return obj;
}
public void seeHouse(){
System.out.println("看房子");
}
}
4.客户角色(客户)
public class Client {
public static void main(String[] args) {
Host host=new Host();
//代理类(这里没有代理类,但是有处理程序的类,在该类中获取动态代理)
ProxyInvocationHandler pih=new ProxyInvocationHandler();
//设置要代理的对象
pih.setRent(host);
//获取动态代理类
Rent rent=(Rent)pih.getProxy();
rent.rent();
}
}
代码运行结果
看房子
我要把房子租出去
六.总结
代理模式的好处(在不改变原有的代码上添加额外的功能):
可以使真实角色的操作更加纯粹(不改变源代码),不用去关注一些公共的业务;
公共业务:就是交给代理角色处理,实现的业务分工,公共业务发生扩展的时候,方便集中管理;