文章目录
- 一、代理模式
- 1、代理模式的好处和缺点
- 1.1 代理模式理解加深
一、代理模式
- 为什么要学习代理模式?
代理模式是Spring AOP 以及 Spring MVC 的底层!!并且还是 JAVA 的23种设计模式之一!!
-
代理模式的分类:
-
静态代理
-
动态代理
-
-
什么是代理模式:
如果我们出现了诉求,但是因为某些原因我们本身不想或者无法完成这种诉求,我们就需要寻求他人的帮助,由他人来完成诉求,然后我们直接获取成果就可以了。
打个比方:学生毕业之后工作是需要租房子的,但是学生通常找不到想要把房子租出去的房主,房主也不知道那些学生想要租房子。这时候学生和房主便可以找到中介,由中介来完成租房以及找房的这个过程。最终学生和房东只需要交笔中介费便达成了自己的目的。
-
角色分析
- 抽象角色: 比如房东想要把房子租出去这个行为。通常会使用接口或者抽象类来解决。
- 真实角色: 被代理的角色,比如房东。
- 代理角色: 代理真实角色,比如中介。代理真实角色后,我们一般会做一些附属操作,比如看房、签合同等。
- 客户角色: 访问代理对象的人!比如租房子的人。
-
代理模式代码演示
-
抽象角色,房东将房子租出去的诉求
public interface HouseRental { void houseRental(); }
-
真实角色,房东本身,也就是被代理的人
public class Homeowner implements HouseRental{ @Override public void houseRental() { System.out.println("房东请求中介将房子出租出去"); } }
-
代理角色,比如中介,中介代理房东将房子出租出去,并且进行相关的操作
public class Intermediary implements HouseRental{ private Homeowner homeowner; public Intermediary(Homeowner homeowner) { this.homeowner = homeowner; } @Override public void houseRental() { homeowner.houseRental(); seeHouse(); sign(); fee(); } //看房 public void seeHouse(){ System.out.println("中介带着看房子!"); } //签合同 public void sign(){ System.out.println("和中介签署租赁合同!"); } //收费用 public void fee(){ System.out.println("中介收取费用!"); } }
-
客户角色,比如想要租房子的人
public class Client { public static void main(String[] args) { // 租户无需直接面对房东 Homeowner homeowner = new Homeowner(); // 房东找到了中介,请求把房主租出去 Intermediary intermediary = new Intermediary(homeowner); // 租户找到了中介,请求租房子 intermediary.houseRental(); } }
-
代码执行结果:
-
1、代理模式的好处和缺点
-
好处
-
可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
-
公共角色就交给代理角色!实现了业务的分工!
-
公共业务发生扩展的时候,方便集中管理!
-
-
缺点
- 一个真实角色就会产生一个代理角色,代码量级会翻倍,开发效率会降低。
1.1 代理模式理解加深
-
业务场景:公司需要对用户进行增删改查操作
-
接口
public interface UserService { // 业务场景:公司需要对人员进行增删改查操作 void add(); void update(); void delete(); void query(); }
-
真实角色
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加了一个用户"); } @Override public void update() { System.out.println("修改了一个用户"); } @Override public void delete() { System.out.println("删除了一个用户"); } @Override public void query() { System.out.println("查询用户信息"); } }
-
客户端角色访问
public class Client { public static void main(String[] args) { UserServiceImpl userService = new UserServiceImpl(); userService.update(); } }
-
执行结果:修改了一个用户
-
-
业务变更:公司需要对用户进行增删改查操作的同时需要将对应的操作行为以日志的形式打印出来
-
如果在操作的同时将日志打印出来的话其实也可以,但是会有大量的代码重复操作,并且代码原则通常是不修改原本好用的代码,如果有变动一般以新增代码为主
-
接口以及真实角色实现类内容不变,创建代理角色
public class Proxy implements UserService{ // 将真实角色进行代理 private UserServiceImpl userService; // 通过 Set 方法完成代理动作 public void setUserService(UserServiceImpl userService) { this.userService = userService; } public void add() { log("add"); userService.add(); } public void delete() { log("delete"); userService.delete(); } public void update() { log("update"); userService.update(); } public void query() { log("query"); userService.query(); } // 打印日志 public void log(String mag){ System.out.println("执行了" + mag +"方法"); } }
-
客户端调用代理角色
public class Client { public static void main(String[] args) { // 客户端调用真实角色 UserServiceImpl userService = new UserServiceImpl(); // 真实角色将部分内容交给代理角色处理 Proxy proxy = new Proxy(); proxy.setUserService(userService); proxy.add(); proxy.delete(); proxy.update(); proxy.query(); } }
-
执行结果
-
-