代理模式之静态代理

代理模式

代理模式为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。

在这里插入图片描述

从图中可以看出,代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)形成一个“品”字结构。 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。 代理模式一般涉及到的角色有:抽象角色:声明真实对象和代理对象的共同接口,对应代理接口(Subject);真实角色:代理角色所代表的真实对象,是我们最终要引用的对象,对应委托类(RealSubject);代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装,对应代理类(ProxySubject)。

静态代理

所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

静态代理示例

UserDao接口
public interface UserDao {
    void delete();
}
接口实现类UserDaoImpl
@Component
public class UserDaoImpl implements UserDao {
    @Override
    public void delete() {
        System.out.println("++++ 业务处理前操作 ++++");
        System.out.println("==== 进行删除业务处理 ====");
        System.out.println("++++ 业务处理后操作 ++++");
    }
}

假如说有大量的方法都要进行业务处理前操作和业务处理后操作,那么就需要在每个方法的业务代码执行前后都进行重复性操作,这样不仅效率低、冗余代码多而且一旦业务处理前后的操作需要改变,那么就需要修改每个方法。

使用静态代理模式:StaticProxyImpl
@Component
public class StaticProxyImpl implements UserDao {
    @Autowired
    private UserDaoImpl userDao; // 创建真正的目标对象,用于执行真正的业务代码

    @Override
    public void delete() {
        System.out.println("++++ 业务处理前操作 ++++");

       // 执行真正的业务代码
        userDao.delete();

        System.out.println("++++ 业务处理后操作 ++++");
    }
}

静态代理优点

  1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

静态代理缺点

  1. 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
  2. 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。

GitHub源码地址 静态代理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值