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

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 设计模式之代理模式、静态代理模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

  • 缺点

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

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

本专栏下一篇:设计模式之动态代理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123927.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!