代理模式是SpringAOP的底层
代理模式分类
1. 可以使真实的角色操作更加存粹,不用关注一些公共的业务
2. 公共的业务可以交给代理角色,实现业务分工
3. 公共业务发生拓展的时候方便集中管理
4. 一个真实角色就会产生一个代理角色,代码量会多
角色分析:
- 抽象角色:一般会使用接口或者抽象类解决 (上图中的租房这个操作)
- 真实角色:被代理的角色 (房东)
- 代理角色:代理真实的角色,代理真实角色会做一些附属操作 (中介)
- 客户:访问代理对象的人 (租房的人)
真实角色(被代理的角色)
package com.my.demo01;
//房东出租房
public class HouseMaster {
public void rent(){
System.out.println("房东出租房子!");
}
}
接口(要做的事件)
package com.my.demo01;
//租房接口
public interface Rent {
public void rent();
}
代理角色(中介)
package com.my.demo01;
public class Proxy implements Rent{
private HouseMaster houseMaster;
public Proxy() {
}
public Proxy(HouseMaster houseMaster) {
this.houseMaster = houseMaster;
}
//出租房
public void rent() {
houseMaster.rent();
check();
getMoney();
HeTong();
}
//看房
public void check(){
System.out.println("中介看房");
}
//收中介费
public void getMoney(){
System.out.println("中介收钱");
}
//签合同
public void HeTong(){
System.out.println("中介签合同");
}
}
客户端访问角色(要办事的人)
package com.my.demo01;
public class Client {
public static void main(String[] args) {
//房东出租房子
HouseMaster houseMaster = new HouseMaster();
//中介代理 中介有附加的其他的附属操作
Proxy proxy = new Proxy(houseMaster);
//租户不用面对房东,直接找中介租房
proxy.rent();
}
}
房东出租房子!
中介看房
中介收钱
中介签合同
动态代理和静态代理角色一样
动态代理的代理类是动态生成的不是直接写好的
动态代理分为两大类 基于接口 基于类的
基于接口:JDK动态代理
基于类:cglib
java字节码实现
两个类
Proxy:代理 InvocationHandler:调用处理程序
被代理的人(要出租的房东)
package com.my.demo03;
//房东出租房
public class HouseMaster implements Rent {
public void rent(){
System.out.println("房东出租房子!");
}
}
要创建的代理并附加的拓展业务
package com.my.demo03;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//使用这个类自动生成代理类
public class CreateProxy implements InvocationHandler {
//被代理的接口
private Rent rent;
public void setRent(Rent rent){
this.rent = rent;
}
/*创建模式:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class<?>[] { Foo.class },
handler);*/
//得到代理类
public Object GetProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this );
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
see();
//动态代理的本质就是使用反射机制
Object result = method.invoke(rent,args);
getMoney();
return result;
}
public void see(){
System.out.println("中介看房子");
}
public void getMoney(){
System.out.println("中介收钱");
}
}
租房事件
package com.my.demo03;
//租房接口
public interface Rent {
public void rent();
}
要租房的客户
package com.my.demo03;
public class Client {
public static void main(String[] args) {
//真实角色,被代理的
HouseMaster master = new HouseMaster();
//代理角色 现在还没创建
CreateProxy createProxy = new CreateProxy();
//通过调用程序处理角色来处理要调用的接口对象
createProxy.setRent(master);
Rent proxy = (Rent) createProxy.GetProxy();//动态生成的代理
proxy.rent();
}
}
创建代理类的万能格式
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//使用这个类自动生成代理类
public class CreateProxy implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target){
this.target = target;
}
//得到代理类
public Object GetProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this );
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质就是使用反射机制
Object result = method.invoke(target,args);
return result;
}
}
1. 可以使真实的角色操作更加存粹,不用关注一些公共的业务
2. 公共的业务可以交给代理角色,实现业务分工
3. 公共业务发生拓展的时候方便集中管理
4. 一个动态代理类代理的是一个接口,一般对应一类业务
5. 一个动态代理类可以代理多个类,只要实现了同一个接口即可
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/152878.html