案例:静态代理和动态代理(用invoke访问目标方法)。
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
接口
被代理类
代理类(通过接口调业务类;在不修改源对象的情况下在代理类中写各个实现类的共有操作,如检查合法性等等)
测试
总结:代理类和被代理类都要实现同一个接口,代理类聚合接口从而实现对被代理类方法的调用,调被代理方法时可以在代理类里加操作。实现了不修改目标类的前提下对目标类的功能扩充,前提是要有多个要被代理的类,并且这些类在调用时都要进行相同的检测或操作时可以用静态代理。
接口
被代理类实现接口
代理类(聚合目标对象)
测试
在控制台的teach()方法追进来,到这句输出位置,此时方法时目标对象的teach方法,参数为目标对象方法的参数。
将要代理的目标对象传进去,返回一个代理对象在内存中。
静态代理与动态代理区别,前者的目标类和代理类都要实现接口;后者的代理类不需要实现接口。
被代理类
代理类
调用目标对象方法时就会执行这个intercept方法。
测试
以上都不变,只变下面即可得到目标方法的返回值。
静态代理: 了解设计模式中的代理模式的童鞋应该都知道如果想要为被代理类生成代理,需要让代理类和被代理类共同实现同一个接口,在代理类中增加额外逻辑来实现代理模式,这种方式在编译期间就已经确认了哪个类是代理类,被代理的又是哪个类,这都是需要开发人员在编译前就编写好的,是为静态。
动态代理: 其实动态代理与静态代理的本质一样,最终程序运行时都需要生成一个代理对象实例,通过它来完成相关增强以及业务逻辑,只不过静态代理需要硬编码的方式指定,而动态代理支持运行时动态生成这种实现方式。动态生成的好处很明显,在编码时,代理逻辑与业务逻辑互相独立,各不影响,没有侵入,没有耦合。