Java 静态代理和动态代理

静态代理的缺点:
一个真实角色就会产生一个代理角色;代码量会翻倍-开发效率会降低

真实对象:

代理对象:(其实就是有一个私有属性为:真实对象,这样就可以调用真是对象的方法
,然后有个一个带参构造方法,参数为真是对象,也可以不要这个构造方法,用set方法代替,在加上一新的功能方法,比如这里的log()方法,再在原有的方法中加上这个新的功能方法,也就达到了效果)

public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
// public void setUserService(UserServiceImpl userService) {
// this.userService = userService;
// }

public UserServiceProxy(UserServiceImpl userService){
    this.userService = userService;
}
@Override
public void add() {
    log("add");
    userService.add();
}

@Override
public void delete() {
    log("delete");
    userService.delete();
}

@Override
public void update() {
    log("update");
    userService.update();
}

@Override
public void query() {
    log("query");
    userService.query();
}

public void log(String msg){
    System.out.println("debug了"+msg);
}

}

这就是静态代理:(感觉代码增加了很多,建议使用动态代理)

动态代理:
基于接口的动态代理

需要了解两个类:proxy 提供了创建动态代理类和实例的静态方法,生成代理实例的
InvocationHandler()调用处理程序,并返回结果的

动态代理的优点:
一个动态代理可以代理多个类,只要是实现同一个接口

在这里插入图片描述
在这里插入图片描述

public class ProxyInvocationHandler implements InvocationHandler {

//被代理的接口
private Rent rent;

public void setRent(Rent rent) {
    this.rent = rent;
}

//    public ProxyInvocationHandler(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);
    fare();
    return result;
}

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

public void fare(){
    System.out.println("收中介费");
}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值