首页 > 编程语言 >java中的代理

java中的代理

时间:2024-04-29 16:24:37浏览次数:31  
标签:java 代购 void Object 代理 clothesFactory public

目录

定义

  • 是一种设计模式,提供对目标对象另外的访问方式

好处

  1. 目标对象可以间接访问
  2. 可以在目标对象实现的基础上,增强额外的功能,即扩展目标对象的功能
  3. 不改变原有代码的前提下,可以通过代理来扩展

分类

  1. 静态代理

    1. 示例(接口实现)

      通过让目标类和代理类实现同一个接口来进行关联目标类和代理类,代理类可以有自己的扩展方法

    2. 例一:(海外代购)
      // 接口
      public interface ByClothes {
          void clothes(String size);
      }
      
      // 目标类
      public class ClothesFactory implements ByClothes {
          @Override
          public void clothes(String size) {
              System.out.println("为您制作了" + size + "码的衣服");
          }
      }
      
      // 代理类
      public class ClothesProxy implements ByClothes {
      
          // 目标对象
          public ClothesFactory clothesFactory;
      
          public ClothesProxy(ClothesFactory clothesFactory) {
              // 保存目标对象
              this.clothesFactory = clothesFactory;
          }
      
          @Override
          public void clothes(String size) {
              // 额外的功能
              frontService();
              // 调用目标对象的方法
              clothesFactory.clothes(size);
      
              // 额外的功能
              endService();
          }
      
          public void frontService() {
              System.out.println("根据您的需求进行产品研发");
          }
      
          public void endService() {
              System.out.println("产品交付, 祝您使用愉快");
          }
      }
      
      // 测试类
      public class Test {
          public static void main(String[] args) {
              ClothesFactory clothesFactory = new ClothesFactory();
              ClothesProxy clothesProxy = new ClothesProxy(clothesFactory);
              clothesProxy.clothes("XL");
          }
      }
      

      通过代理类里面创建并调用目标类对象的方法来实现代理

      //最终输出
      根据您的需求进行产品研发
      工厂为您制作了XL码的衣服
      产品交付, 祝您使用愉快
      
  2. 动态代理

    1. jdk动态代理(接口)
      1. 示例2(代理多个品类)

        public interface ByShoot {
            void shoot(String size);
        }
        
        public class ShootFactory implements ByShoot {
            @Override
            public void shoot(String size) {
                System.out.println("工厂为您制作了" + size + "码的鞋子");
            }
        }
        
        import java.lang.reflect.InvocationHandler;
        import java.lang.reflect.Method;
        import java.lang.reflect.Proxy;
        
        
        // 代理工厂类
        public class Company implements InvocationHandler {
            // 目标对象
            private Object factory;
        
            public Object getFactory() {
                return factory;
            }
        
            public void setFactory(Object factory) {
                this.factory = factory;
            }
        
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 额外的操作
                frontService();
                // 调用目标对象的方法
                Object obj = method.invoke(factory, args);
                // 额外的操作
                endService();
                return obj;
            }
        
            // 获取代购员对象
            public Object getProxyInstance() {
                return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
            }
        
            public void frontService() {
                System.out.println("根据您的需求进行产品研发");
            }
        
            public void endService() {
                System.out.println("产品交付, 祝您使用愉快");
            }
        }
        

        通过setFactory设置不同的工厂就可以获得不同的代理对象,从而实现动态代理

        // 测试类
        public class Test {
            public static void main(String[] args) {
                // 工厂实例
                ClothesFactory clothesFactory = new ClothesFactory();
                ShootFactory shootFactory = new ShootFactory();
                // 代购公司实例
                Company company = new Company();
                // 代购公司设置代购工厂
                company.setFactory(clothesFactory);
                // 获取代理对象
                ByClothes byClothes = (ByClothes) company.getProxyInstance();
                byClothes.clothes("XXL");
                // 代购公司设置代购工厂
                company.setFactory(shootFactory);
                // 获得代购对象
                ByShoot byShoot = (ByShoot) company.getProxyInstance();
                byShoot.shoot("41.5");
            }
        }
        
    2. CGLIB代理(继承)

标签:java,代购,void,Object,代理,clothesFactory,public
From: https://www.cnblogs.com/ning23/p/18165992

相关文章

  • 【转】[Java] 防止并发的多种写法
    来自:阿里的通义灵码要确保在Java中同一方法被多个线程同时调用时,只有其中一个成功执行,可以采用几种并发控制策略。以下是几种实现方式:1.使用ReentrantLock的tryLock()importjava.util.concurrent.locks.ReentrantLock;publicclassSingletonExecution{privatesta......
  • 2-LinuxJava安装
    环境CentOS7.5Java8卸载现有JDKrpm-qa|grep-ijava|xargs-n1sudorpm-e--nodseps上传Java压缩包将jdk-8u212-linux-x64.tar文件上传到/opt/software目录中解压Java压缩包进入/opt/software目录cd/opt/software解压缩文件到指定目录tar......
  • Java方法
    基本类型和引用类型的不同对于基本类型,它的值直接保存在变量中;对于引用类型,它保存的是实际对象的地址,引用指向实际对象,实际对象中保存着内容;赋值运算符对基本类型与引用类型的作用对于基本类型,赋值运算符会直接改变变量的值,原来的值会被覆盖掉;对于引用数据类型,赋值运算符会......
  • java代码运行出现DENIED Redis is running in protected mode because protected mode
    这个错误是因为开启了保护模式,导致出错。所以需要关闭redis的保护模式。编辑redis的redis.config  注释bind127.0.0.1 、修改protected-mode为no、修改 daemonize为no然后重启redis ......
  • mORMot 1.18 第08章 Delphi中的服务器端JavaScript
    mORMot1.18第8章Delphi中的服务器端JavaScript在mORMot框架中,对JavaScript脚本的支持被称为MonkeyOnRails(版权归PavelMashlyakovsky所有,邮箱:[email protected]),它借助了Mozilla基金会的SpiderMonkey类。mORMot允许程序员编写功能强大的应用程序,但如果客户希望自定义应用......
  • 爬虫自动化之drissionpage实现随时切换代理ip
    爬虫自动化之drissionpage实现随时切换代理iphttps://blog.csdn.net/qq_32334103/article/details/126133862下载SwitchyOmega地址:https://github.com/FelisCatus/SwitchyOmega/releases  importplatformfromDrissionPageimportChromiumPage,ChromiumOptions......
  • javac编译java后缀编成class
    前言全局说明一、编译独立.java后缀文件此java文件,没有依赖外部任何jar包。文件名:test_print.javapublicclasstest_print{publicstaticvoidmain(String[]args){if(args.length==1){System.out.println("[INFO]Userargs:"+args[......
  • Java线程池控制线程存活时间的机制
    核心线程:永不销毁:此类线程处理完任务后,会调用任务队列的take方法,此方法是阻塞的,假如队列为空了,该线程就会被阻塞住,线程就能一直存活着了。非核心线程:空闲指定时间后,会被销毁:此类线程处理完任务后,会通过调用任务队列的pop方法,此方法接收一个时间参数且是限时阻塞的,假如队......
  • 顶级 Javaer 都在用的 20 个类库,真香!
    优秀且经验丰富的Java开发人员的特征之一是对API的广泛了解,包括JDK和第三方库。我花了很多时间来学习API,尤其是在阅读了EffectiveJava3rdEdition之后,JoshuaBloch建议在Java3rdEdition中使用现有的API进行开发,而不是为常见的东西编写新的代码。这对我来说很有意义,因为这些......
  • Java 线程Dump分析
    一般当服务器挂起,崩溃或者性能低下时,就需要抓取服务器的线程堆栈(ThreadDump)用于后续的分析。在实际运行中,往往一次dump的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threaddump,每次间隔10-20s,建议至少产生三次dump信息,如果每次dump都指向同一个问题,我们......