代理模式

Posted toov5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

面向切面编程 事务 很多框架地层用到  可以重构重复代码

AOP 的地层的实现也是代理模式     了解事务需要了解代理模式   包装代理设计模式

什么是代理模式

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

技术分享图片

 

 

代理模式应用场景

SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色

代理的分类

静态代理(静态定义代理类)

动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

静态代理

什么是静态代理

程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用之前或调用之后进行处理。既(AOP微实现),AOP核心技术面向切面编程

静态代理和动态代理   静态代理需要些代理类 动态代理不需要

 

废话不多说,上手写代码:

用静态代理,模式下事务原理   

 定义接口  

package DaiLi;

public interface IUserDao {
    public void add();
}

实现接口:

package DaiLi;

public class IUserDaoImpl implements IUserDao {
   
    @Override
    public void add() {
        System.out.println("add方法调用");    
    }

}

代理类也是根据接口去扩展的:

package DaiLi;


public class UserDaoProxy  implements IUserDao{
      //通过构造函数  传入代理对象
      private IUserDao iUserDao;
    
      public UserDaoProxy(IUserDao iUserDao) {
        this.iUserDao=iUserDao;
    }
     //在方法之前之后做拦截处理 
     @Override
    public void add() {
         System.out.println("开启事务");   
         iUserDao.add();     //通过代理 去掉用方法  
         System.out.println("提交事务");
        
    }

}

客户端使用:

package DaiLi;


public class UserDaoProxy  implements IUserDao{
      //通过构造函数  传入代理对象
      private IUserDao iUserDao;
    
      public UserDaoProxy(IUserDao iUserDao) {
        this.iUserDao=iUserDao;
    }
     //在方法之前之后做拦截处理 
     @Override
    public void add() {
         System.out.println("开启事务");   
         iUserDao.add();     //通过代理 去掉用方法  
         System.out.println("提交事务");
        
    }

}

运行结果:

技术分享图片

其实就是接口 然后实现接口  Java的多态嘛  我是这么理解的,小伙伴你们有何见解嘛

  如果业务量比较大  有很多类需要去代理   不利于扩展的  这样

静态代理需要生成代理对象!!! 如果再添加个方法,则会这样:、

技术分享图片

这样很冗余~

 

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)