首先学习之前对其提出3个问题:
1.什么是代理模式?
2.一般用在什么场景?
3.怎么使用代理模式?
那我们围绕这3个问题进行一一的解答,首先是第一个问题,什么是代理模式,今天主要针对的是静态的代理模式:
那我们先讲一个故事,有一个哥们在外打拼多年,经过自己的努力,手里面相应的也有了一些积蓄,随着年龄的增长,打算找一个人度过一生,为了应付以后的丈母娘,所以就想着找一个相对好的房源,但是自己对此又不太了解,于是这个哥们就找了一个中介,并“委托”中介,让中介去找符合自己要求的房源,自己就等着中介的消息就行了,一旦觉得符合自己的预算,并且环境也好,位置也靠近地铁的话,那么核心的“交钱”就行了。
在这个过程中,有一个共同的主题:房子;代理者:中介;被代理者:这个“哥们”。
代理模式的三个要素:1.实现相同的接口。2.代理者(并且持有被代理者的引用)3.被代理者
第二个问题:一般用在什么场景?
我们希望的是我们的业务类只关注的业务的核心,而将容易改变的辅助的业务逻辑交给代理者来代理,实例:1.权限的验证;2.记录日志;3.计算程序运行的时间等
如 3在程序的开发阶段可能需要此功能,而在线上的部署的时候,或许就不在需要此功能;那么对于这种情况就可以使用代理模式代理。
第3个问题:怎么使用代理模式?
为了更好的理解代理模式的使用,就不在使用复杂是逻辑,以及减去对数据库的操作,需求如下:
在添加和删除元素之前,添加日志信息,代码如下:
接口:
/* * 数据操作访问接口: */ public interface Dao { void add();//添加 void delte();//删除 }
被代理者类:
/* * 被代理者的类。 * @author DHB * */ public class UserDao implements Dao { @Override public void add() { System.out.println("商品的添加..."); } @Override public void delte() { System.out.println("商品的删除..."); } }
代理者
/** * 创建代理者的类: * 1.要持有被代理者的引用:将对象,通过构造器传进来。 * @author DHB * */ public class ProxyDemo implements Dao { private UserDao userDao; public ProxyDemo(UserDao userDao) { this.userDao = userDao; } @Override public void add() { //时常修改的代码: System.out.println("添加成功之前..."); //核心的业务代码仍然需被代理者来写。 userDao.add(); System.out.println("添加成功结束"); } @Override public void delte() { //时常修改的代码: System.out.println("删除成功之前..."); //核心的业务代码仍然需被代理者来写。 userDao.delte(); System.out.println("删除成功之后..."); } }
测试代码:
public class AgentDemo { public static void main(String[] args) { ProxyDemo proxy = new ProxyDemo(new UserDao()); proxy.add(); } }
使用代理模式的话,如果业务逻辑发生变化的话,那么主业务不需要更改,只需要改变代理者的代码就ok了。
那么我们不仅要问,静态代理是不是就是完美的哪?答案当然是否定的;原因是如果被代理的类只有一个的话,那使用静态的代理模式没问题,如果被代理的类有多个的话,那么就要写多个代理类,这样就会很麻烦,这显然不是我们想要的结果。
那么我们怎么解决哪?可以使用动态的代理。
注:动态的代理将在后续的篇文中展示,如果有需要的小伙伴,可以继续关注我哦 ~o~