用一个租房子的案例来讲解代理模式的概念
- 房东要出租房子,他把这个事情交给了中介,中介帮他出租房子,租客原本要找房东租房子,但是现在只需要找中介即可。
- 这样做有什么好处呢?我们把中介看成一个类,把房东看成一个接口,房东只有一个业务,就是出租房子,当中介拿到了房东的接口,也能实现出租房子的业务,但是中介还能有其他业务,比如签合同,看房等等,这些业务是房东没有的。
在上面的例子里:
- 房东—-真实角色
- 中介—-代理角色
代理模式的好处:
- 可以使真实角色的操作更加存粹,不用关注公共业务
- 公共业务就交给代理角色,实现了业务的分工
- 把增添新的业务交给代理类,不会让原有代码受到更改
案例如下:
接口:
实现类:
现在我想加一个日志功能,但是为了保护原有代码的完整性,不能在原来的代码里增加功能,这个时候就可以使用代理类,我们在代理类中实现日志功能,这样就避免了修改原有代码。
代理类:
以上所展现的方式是静态代理,每有一个公共接口就要创建一个与之对应的代理类,这样太麻烦了,有没有能自动生成代理类的方法呢?这时,就有了动态代理模式,我们不需要手动的创建Proxy代理类,只需调用固定的方法,就可以实现自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//InvocationHandler handler = new MyInvocationHandler(...);//Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class
测试类:
public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();ProxyInvocationHandler pih = new ProxyInvocationHandler();//创建一个等会要被代理的接口pih.setTarget(userService);//注意这里转型的是UserService接口而不是UserServiceImpl实现类UserService proxy = (UserService) pih.getProxy();proxy.add();proxy.delete();}}
我们可以把上面的这个类看成一个自动生成代理类的工具类,只需要调用这个类中的方法,就可以实现动态代理