代理模式
为什么要学代理模式?因为这就是spring AOP的低层【spring 和 spring MVC】
静态代理
角色分析
- 抽象角色 一般使用抽象的类或接口;
- 真实角色 被代理的角色;
- 代理角色 代理真实的角色 代理真实角色后 我们一般会进行一些附属操作;
- 客户 访问代理角色的人;
代理模式的好处:
- 可以使真实角色更纯粹,不用关心公共的业务;
- 代理角色负责公共的业务,实现了业务的分工;
- 公共业务拓展时,方便集中管理 ;
- 缺点很明显,不能做到动态的代理真实对象 , 一个真实对象就需要哟个代理;
代码步骤
1.接口
package com.sl.dao;
public interface Rent {
public void rent();
}
2.真实对象
package com.sl.pojo;
import com.sl.dao.Rent;
public class Fd implements Rent {
public void rent() {
System.out.println("房东出租房子");
}
}
3.代理对象
package com.sl.config;
import com.sl.pojo.Fd;
public class Dl {
private Fd fd;
public Dl(){
}
public Dl(Fd fd) {
this.fd = fd;
}
public void rent(){
Kan();
fd.rent();
Qian();
}
//看房
public void Kan(){
System.out.println("看房");
}
//签合同
public void Qian(){
System.out.println("签合同");
}
}
4.客户端访问代理对象
import com.sl.config.Dl;
import com.sl.pojo.Fd;
public class Tests {
public static void main(String[] args) {
//真实对象
Fd f = new Fd();
//代理真实对象
Dl dl = new Dl(f);
//开始业务
dl.rent();
}
}
动态代理
- 动态代理的类是自动生成的;
- 角色与静态代理一致
- 动态代理分为两大类 基于接口的 和基于类的
- 基于接口的代理 ---->JDK 动态代理
- 基于类 : cglib
- java字节码实现 : javasist
代理模式的好处:
动态生成生成代理类 (代理的那个接口 就转成那个接口)
//这个类自动生成 代理类 实现接口InvocationHandler
public class Dl implements InvocationHandler {
//被代理的接口
private Object targer;
//设置需要代理的类
public void setRent(Object rent) {
this.targer = rent;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),
targer.getClass().getInterfaces(),
this);
}
//处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = method.invoke(targer,args);
return object;
}
}
//测试类
public static void main(String[] args) {
//真实角色
Fd f = new Fd();
//代理对象;暂时没有
Dl d =new Dl();
//设置需要代理了的对象
d.setRent(f);
//动态生成生成代理类 (代理的那个接口 就转成那个接口)
Rent rent = (Rent) d.getProxy();
//调用方法即
rent.rent();
}