设计模式之代理模式、静态代理模式

8.代理模式
  • 代理模式是一种设计模式,代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

  • SpringAOP的底层
    在这里插入图片描述

  • 代理模式分类:静态代理/动态代理

  • 案例:租客需要租车,车主需要出租车,但租前要签合同等附加协议。这些流程租客和车主都应该不需管理,两者仅仅是一个租车和出租的需求,况且有时候找不到车主,那就需要中介来管理这套租车流程,而中介和车主都能实现出租的功能,租客直接找中介来租车。

  • 不改变原有对象功能的基础上扩展一些其他功能用代理

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声明式事物用到的就是动态代理,你以为你执行的是删除修改方法,其实执行的是代理方法,所以才能实现对表操作的回滚

  • 缺点

静态代理:一个真实角色会产生一个代理角色;代码量会翻倍,影响开发效率。

可以理解为每个房东出租的要求不一样,所以每个房东的代理也不一样。也就是是代理类已经被定义好了,也就是代码写死了,包含了确定的真实对象,不利于扩展,才有动态代理的出现。

本专栏下一篇:设计模式之动态代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值