java设计模式之代理模式-静态代理模式学习整理
代理模式:由于某些原因需要为其他对象提供一个代理,通过该代理实现控制对该对象的访问的目的。
这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
代理模式结构图
代理模式主要角色
1.抽象主题(Subject)角色
2.真实主题(RealSubject)角色
3.代理(Proxy)角色
为什么要用代理模式?
1)中介隔离作用;2)开闭原则,增加功能。
代理模式分类
核心两点:1)真实对象和代理对象需要实现同一个接口;2)代理对象需要持有真实对象的引用。
举例理解:
1)以租房为例,房东只需要考虑处理自己的房子交给中介即可,其余的都是由中介充当代理同租客进行签协议,带租客看房子,等等。
2)真实对象–>你,代理对象–>婚庆公司,接口–>结婚
new WeddingCompany(new Me()).marry();
即 new ProxyObject(new RealObject()).interfaceDefinedFun();
代码实现方式:
(1)继承关系(存在缺陷)
真实主题角色:
代理主题角色:
测试类:
(2)接口实现(优化)
抽象主题角色:
真实主题角色(多个):
代理主题角色:
测试类:
总结:
使用了静态代理模式情况下,我们没有修改真实角色类中的业务代码,而是选择以代理类的方式增强了它的功能,耦合度低,可扩展性好。静态代理由于不需要通过反射获取目标对象,所以性能也更好。
但代理模式会造成系统设计中类的数量增加,在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢,同时也增加了系统的复杂度。
优点:真实角色也就是业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
参考博客:
1)https://blog.csdn.net/S_yyuan/article/details/121561438;
2)https://blog.csdn.net/qq_53311045/article/details/122156602;
3)https://blog.csdn.net/yz1925506412/article/details/123667565;
4)kkb-wln-teacher直播公开课:https://www.kaikeba.com/open/item?c=1463