概念
代理商是一种模式,提供了对目标对象的间接访问方式,即通过代理商访问目标对象。我们在软件设计时常用的代理商一般是指静态代理商,也就是在代码中显式指定的代理商。对目标对象的间接访问
image.png用途
便于在目标实现的基础上添加额外的功能操作,前阻拦,后阻拦等,以满足自身的业务需求,同时代理商模式便于扩展目标对象功能的特点也为多人所用。- 添加预解决、调用后解决等操作
- 扩展功能
组成
- 业务接口
- 业务实现类 负责实现主要的业务方法
- 业务代理商类 负责对调用的业务方法作阻拦、过滤、预解决。
案例演示
接口
public interface IAccountService { // 查询账户 public void queryAccount(); // 修改账户 public void updateAccount();}业务实现类
public class AccountServiceImpl implements IAccountService{ @Override public void queryAccount() { System.out.println("查看账户..."); } @Override public void updateAccount() { System.out.println("修改账户..."); }}业务代理商类
public class AccountServiceProxy implements IAccountService { private IAccountService accountService; //组合一个业务实现类对象来进行真正的业务方法的调用 /** * 覆盖默认构造器 * * @param accountService */ public AccountServiceProxy(IAccountService accountService) { this.accountService = accountService; } @Override public void queryAccount() { System.out.println("查询账户的预解决——————"); // 调用真正的查询账户方法 accountService.queryAccount(); System.out.println("查询账户之后————————"); } @Override public void updateAccount() { System.out.println("修改账户之前的预解决——————"); // 调用真正的修改账户操作 accountService.updateAccount(); System.out.println("修改账户之后——————————"); }}调用
public class Application { public static void main(String[] args) { IAccountService accountService = new AccountServiceImpl(); AccountServiceProxy accountProxy = new AccountServiceProxy(accountService); accountProxy.updateAccount(); accountProxy.queryAccount(); }}
静态代理商缺点分析
一个代理商类只能对一个业务接口的实现类进行包装,假如有多个业务接口的话就要定义很多实现类和代理商类才行。
假如代理商类对业务方法的预解决、调用后操作都是一样的(比方:调用前输出提醒、调用后自动关闭连接),则多个代理商类就会有很多重复代码。- 一个代理商类只能对一个业务接口的实现类进行包装
- 多个代理商类中预解决、后解决代码重复
思考题:
是否代理商所有实现类的方法调用:根据传进来的业务实现类和方法名进行具体调用。