8.代理模式
-
代理模式是一种设计模式,代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
-
代理模式分类:静态代理/动态代理
-
案例:租客需要租车,车主需要出租车,但租前要签合同等附加协议。这些流程租客和车主都应该不需管理,两者仅仅是一个租车和出租的需求,况且有时候找不到车主,那就需要中介来管理这套租车流程,而中介和车主都能实现出租的功能,租客直接找中介来租车。
-
不改变原有对象功能的基础上扩展一些其他功能用代理
8.1 静态代理
抽象角色:使用接口和抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色,代理过程中可以做一些附属操作
客户:访问代理角色的用户
- 不需要纠结真实对象在哪里创建,代理模式就是对一个真实对象进行加强。
8.2 举例实现
- 租借接口(抽象概念)
//中介(抽象)类
public interface Rent {
public void rentFunction();
}
- 要代理的真是对象车主去实现租借接口
//代理对象
public class Owner implements Rent{
@Override
public void rentFunction() {
System.out.println("车主出租车");
}
}
- 代理对象,除了去实现租借接口,还需扩展其他的行为(存在意义)
//代理中介,附属其他的行为
public class Agency implements Rent{
private Owner owner;
public Agency(Owner owner){
this.owner = owner;
}
@Override
public void rentFunction() {
beforeFunction();
owner.rentFunction();
afterFunction();
}
public static void beforeFunction() {
System.out.println("租借前行为");
}
public static void afterFunction() {
System.out.println("租借后行为");
}
}
- 测试:客户访问代理对象去满足需求
@Test
public void testStaticProxy(){
Owner owner = new Owner();
//客户找代理去租车
//代理自己去对接车主
//同时代理会在租房的同时有其他的附属操作
Agency agency = new Agency(owner);
agency.rentFunction();
}
- 结果
租借前行为
车主出租车
租借后行为
8.3 作用
- 优点
可以使真实角色的操作更加纯粹,不去关注一些公共的业务
公共的业务交给代理角色,实现了业务分工,降低耦合性
代理角色扩展的公共业务,更容易集中管理
- 在实际开发中,service接口规定了一些规范,serviceImpl去实现它,后续想对service中的每个方法加监控日志,此时你敢改serviceImpl原有的正在运行的代码吗?
- 大概率不会,所以用代理模式,创建一个代理对象去实现service,等同于serviceImpl但又不一样,在这个代理对象中可以扩展一下其他功能,如监控日志等,代理对象的每个方法实际操作的是serviceImpl方法,而在这个方法前后加写操作,后续调用的时候调用店里对象即可
public interface UserService {
void addUser();
void updateUser();
}
public class UserServiceImpl implements UserService{
@Override
public void addUser() {
System.out.println("增加操作");
}
@Override
public void updateUser() {
System.out.println("更新操作");
}
}
- 代理实现
public class UserServiceImplProxy implements UserService{
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void addUser() {
log();
userService.addUser();
}
@Override
public void updateUser() {
log();
userService.updateUser();
}
private void log(){
System.out.println("监控日志");
}
}
- 测试结果
@Test
public void testService(){
UserServiceImpl userService = new UserServiceImpl();
UserServiceImplProxy userServiceImplProxy = new UserServiceImplProxy();
userServiceImplProxy.setUserService(userService);
userServiceImplProxy.addUser();
}
/*
监控日志
增加操作*/
-
spring声明式事物用到的就是动态代理,你以为你执行的是删除修改方法,其实执行的是代理方法,所以才能实现对表操作的回滚
-
缺点
静态代理:一个真实角色会产生一个代理角色;代码量会翻倍,影响开发效率。
可以理解为每个房东出租的要求不一样,所以每个房东的代理也不一样。也就是是代理类已经被定义好了,也就是代码写死了,包含了确定的真实对象,不利于扩展,才有动态代理的出现。
本专栏下一篇:设计模式之动态代理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123927.html