从头捋了一遍 Java 代理机制
俗来说,「代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些额外的操作,并且不用修改这个方法的原有代码」。如果大家学过 Spring 的 AOP,一定能够很好的理解这句话。 举个例子:你找了小红来帮你向小绿问话,小红就看作是代理我的代理类 Proxy,而你是 Real Subject,因为小红要传达的话其实是你说的。那么你和小红都需要实现的接口(Subject)就是说话,由于你俩都能说话,在外界看来你俩就是一样的(滑稽,大家理解就好,不用较真)看到这里,不知道大家能不能理解了为什么委托类和代理类都需要实现相同的接口? 那是为了保持行为的一致性,在访问者看来两者之间就没有区别。这样,通过代理类这个中间层,很好地隐藏和保护了委托类对象,能「有效屏蔽外界对委托类对象的直接访问」。同时,也可以在代理类上加上额外的操作,比如「小红在说话之前会跳一段舞,外界就会觉得你在说话前会跳一段舞,所以,这就实现了委托类的功能增强」。 代理模式有静态代理和动态代理两种实现方式。 3. 静态代理 什么是静态代理 先来看静态代理的实现步骤: 1)定义一个接口(Subject) 2)创建一个委托类(Real Subject)实现这个接口 3)创建一个代理类(Proxy)同样实现这个接口 4)「将委托类 Real Subject 注入进代理类 Proxy」,在代理类的方法中调用 Real Subject 中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。 从实现和应用角度来说,静态代理中,我们对目标对象的每个方法的增强都是手动完成的,非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。 从 JVM 层面来说, 「静态代理在编译时就将接口、委托类、代理类这些都变成了一个个实际的 .class 文件。」 代码示例
1)定义发送短信的接口 (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |