轻松掌握Java代理模式_java

和大家一起聊一聊java代理模式

1、静态代理

1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。 

public interface IUserDao {
  void save();
} 

1.2被代理的类,目标对象 

public class UserDao implements IUserDao{
  @Override
  public void save() {
    System.out.println("-----已经保存数据!!!------");
  }
} 

1.3代理对象 

public class UserDaoProxy implements IUserDao{
  // 接收保存目标对象
  private IUserDao target;
  public UserDaoProxy(IUserDao target) {
    this.target = target;
  }
  @Override
  public void save() {
    System.out.println("开始事务...");
    target.save();       // 执行目标对象的方法
    System.out.println("提交事务...");
  }
}

1.4测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    IUserDao target = new UserDao();
    // 代理
    IUserDao proxy = new UserDaoProxy(target);
    proxy.save(); // 执行的是,代理的方法
  }
}

2、动态代理

2.1同样的,动态代理也需要完成一个接口。(同上)

2.2目标对象也是相同的。

2.3只是在代理对象上有所不同 

public class ProxyFactory {
  // 维护一个目标对象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 给目标对象,生成代理对象
  public Object getProxyInstance() {
    return Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
            System.out.println("开启事务");
            // 执行目标对象方法
            Object returnValue = method.invoke(target, args);
            System.out.println("提交事务");
            return returnValue;
          }
        });
  }
}

2.4测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    IUserDao target = new UserDao();
    System.out.println(target.getClass());
    // 给目标对象,创建代理对象
    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 执行方法  【代理对象】
    proxy.save();
  }
}

3、cglib代理

3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。 

public class ProxyFactory implements MethodInterceptor{
  // 维护目标对象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 给目标对象创建代理对象
  public Object getProxyInstance(){
    //1. 工具类
    Enhancer en = new Enhancer();
    //2. 设置父类
    en.setSuperclass(target.getClass());
    //3. 设置回调函数
    en.setCallback(this);
    //4. 创建子类(代理对象)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {
    System.out.println("开始事务.....");
    // 执行目标对象的方法
    Object returnValue = method.invoke(target, args);
    System.out.println("提交事务.....");
    return returnValue;
  }
}

3.3测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    UserDao target = new UserDao();
    System.out.println(target.getClass());
    // 代理对象
    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 执行代理对象的方法
    proxy.save();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
代理模式
30天轻松掌握javaweb、轻松掌握javaweb视频、java 代理模式、java 代理模式详解、动态代理模式 java,以便于您获取更多的相关知识。

时间: 2024-11-03 18:23:35

轻松掌握Java代理模式_java的相关文章

轻松掌握Java命令模式_java

定义:请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 特点:     1.降低了系统耦合度.     2.新的命令可以很容易添加到系统中去. 企业级开发和常用框架中的应用:事务,struts的action控制器 实例: public class Demo { public static void main(String[] args) { Reicever reicever = new Reicever(); Co

轻松掌握Java状态模式_java

定义:在状态模式(State Pattern)中,类的行为是基于它的状态改变的. 特点: 1.封装了转换规则. 2.枚举可能的状态,在枚举状态之前需要确定状态种类. 3.将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为. 4.允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块. 5.可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数. 企业及开发和常用框架中的应用: 实例: public class Demo { p

轻松掌握Java建造者模式_java

建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品的每个部分,然后又director完成最后产品的组装. 特点:     1.分工更加明确,组建和构造分开,能更好的控制产品的生产.     2.容易扩展,有新的需求的时候,只要实现Builder借口就可以了. 企业级开发和常用框架中的应用:JMail 组成:产品类,抽象建造者,建造者,导演. 产品类: public class Product{ privat

轻松掌握Java策略模式_java

定义:一个类的行为或其算法可以在运行时更改.在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 特点:     1.算法可以自由切换.     2.避免使用多重条件判断.     3.扩展性良好. 企业级开发和常用框架中的应用:java.servlet.http.HttpServlet的service方法 实例:对两个数的操作行为. public class Demo { public static v

轻松掌握java组合模式_java

组合模式,将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能. 特点:对于递归或者类似树形的分级数据结构,可以用最简单的方式进行处理. 企业级开发和常用框架中的应用:系统目录结构和网站导航结构 下面以目录结构举例: 场景:假设我们现在有一个目录,目录下面还有子目录和文件,现在我们要查看整个目录及目录下的所有文件和创建时间 具体代码如下: package

轻松掌握Java桥接模式_java

定义:将抽象部分与实现部分分离,使它们都可以独立的变化. 特点:桥接模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展. 企业级开发和常用框架中的应用:多继承的结构 只是从定义理解桥接模式,很难理清它的作用,下面举个例子来说明: 电脑城卖电脑,电脑种类分了平板电脑,笔记本电脑,台式电脑:电脑品牌又分了联想,戴尔,华硕

轻松掌握Java迭代器模式_java

定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 特点:     1.它支持以不同的方式遍历一个聚合对象.     2.迭代器简化了聚合类.     3.在同一个聚合上可以有多个遍历.     4.在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码. 企业级开发和常用框架中的应用:java集合都实现了迭代器 具体实例: public class Demo { public static void main(String[] args) { ActualContai

轻松掌握java外观模式_java

定义:外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用 特点:     (1)实现了子系统与客户端之间的松耦合关系.     (2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易. 企业级开发和常用框架重的应用:很多,比如常见的字符串的分割方法spilt也是 具体实例: package com.test.faced; /** * 以喝茶为例:我们要喝茶,就得有茶具,茶叶,煮茶工具等 */

详解java动态代理模式_java

本文针对java动态代理进行知识点整理,具体内容如下 一. JAVA的动态代理(比较官方说法) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工