首页 > 编程语言 >Java中的代理模式(个人学习笔记)

Java中的代理模式(个人学习笔记)

时间:2024-08-15 08:56:43浏览次数:14  
标签:Java 代购 void Object factory 笔记 代理 public

什么是代理

  • 代理是一种设计模式,提供了对目标对象另外的访问方式。(用户不需要直接访问目标对象,只需要接触代理对象就能实现访问)

什么是代理

代理的好处

  1. 目标对象可以被间接访问
  2. 可以在目标对象实现的基础上实现额外的功能(除了目标对象提供的方法外,代理可以额外提供一些实用的方法),即扩展目标对象的功能
  3. 不会轻易修改原有代码,如果需要修改需求,可以通过代理去扩展

实现代理的方式

代理

  • 静态代理只能完成对固定类的代理,动态代理的底层通过反射实现,可以完成任意类的代理(静态代理也可以通过接口继承实现)
  • 实现JDK动态代理主要依赖接口实现
  • 需要第三方jar包支撑来实现的功能,一般通过继承来实现

代理实现

代码示例

静态代理(通过接口实现)

//在实现接口的时候,目标类和代理类都必须实现目标接口的方法。从某种意义上,代理类就可以实现目标类的方法,代理类同时可以扩展自己的方法
	
//定义一个接口类,让代理类和目标类都去实现它
public interface ByShop {
    void clothes(String size);
}
    
//定义目标类,这里即买衣服的工厂
public class Factory implements ByShop {
    @Override
    public void clothes(String size) {
    System.out.println("已经为您制作了" + size + "大小尺寸的衣服!");
    }
}
    
//定义代理类,这里是代购
public class Proxy implements ByShop {
    //在代理类中放一个目标对象,目的是实现统一标准
    public Factory factory;
    //这里的代理类只能实现Factory类的代理,因此是静态代理
    public Proxy(Factory factory) {
        this.factory = factory;
    }
    @Override
    public void clothes(String size) {
        frontService();
        factory.clothes(size);
        endService();
    }
    //额外功能
    
    //售前服务
    public void frontService() {
        System.out.println("根据您的需求进行产品研发!");
    }
    //售后服务
    public void endService() {
        System.out.println("产品已交付您,后续有问题随时联系!");
    }
}
    
public class User {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Proxy proxy = new Proxy(factory);
        proxy.clothes("xxl");
    }
}

动态代理(接口实现)

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 {
        Object obj = method.invoke(factory, args); //反射
        return obj;
    }

    //售前服务

    //售后服务

    //获取代购员
    public Object getProxyInstance() { //这个方法内部会调用上面的invoke(Object proxy, Method method, Object[] args)方法
        //newProxyInstance()方法可以创建一个代理对象实例,包含三个参数,第一个为类加载器,第二个接口,第三个为代理类
        return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
    }
}
    
public class User {
    //目标对象
    ClothesFactory clothesFactory = new ClothesFactory();
    ShootsFactory shootsFactory = new ShootsFactory();
    //代购公司
    Company company = new Company();
    company.setFactory(clothesFactory); //为代购公司设置目标对象,实现代购衣服的功能
    ByClothes good1 = (ByClothes)company.getProxyInstance(); //得到一个代购衣服的代购员
    good1.clothes("xxl"); //代购衣服
}

标签:Java,代购,void,Object,factory,笔记,代理,public
From: https://blog.csdn.net/dawn191228/article/details/141127354

相关文章

  • 【LeetCode:3148】矩阵中的最大得分(Java)
    题目链接3148.矩阵中的最大得分题目描述给你一个由正整数组成、大小为mxn的矩阵grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为c1的单元格移动到值为c2的单元格的得分为c2-c1。你可以从任一单元格开始......
  • java语言,MySQL数据库;电影推荐网站 30760(免费领源码)计算机毕业设计项目推荐万套实战教
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的电影推荐网站;电影推荐网站的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本电影推荐网站是针对目前电影推荐网站的实际需求,从实际工作出发,对过去的电影......
  • java语言,MySQL数据库;基于Web的高校知识共享系统设计与实现 32050(免费领源码)计算机毕业
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对高校知识共享系统等问题,对高校知识共享系统进行研究分析,然后开发设计出高校知识共享系统以......
  • java语言,MySQL数据库;23825基于java的员工考勤系统(免费领源码)计算机毕业设计项目推荐万
    摘 要由于数据库和数据仓库技术的快速发展,员工考勤系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。考勤管理系统对处理对象和服务对象,自身的系统结构,处理能力,都将适应技术发展的要求发生重大的变化。员工考勤系统除了具有共享系统的全部功能以外,能通过......
  • 【读书笔记-《30天自制操作系统》-2】Day3
    第三天的内容主要在于IPL的实现,在完成IPL之后又为进入32位模式与导入C语言做了准备。1.磁盘结构IPL的作用是读取操作系统程序,所以IPL最主要的工作就是读取磁盘,将程序读取到内存中。先来看一下磁盘的结构与读取方式。磁盘的样子也类似于这样一个圆柱体,实际读取数据时是......
  • Java 代码本地设置Hadoop用户名密码
    在Hadoop环境中,通常使用Kerberos进行身份验证。但在一些开发或测试环境中,我们可能需要在本地代码中设置用户名和密码来模拟或进行简单的测试。虽然这不是一个安全的做法,因为它违背了Kerberos的使用原则,但在某些场景下(如单元测试或本地开发)可能是必要的。方法一:使用Hadoop的API来......
  • Java流量控制
    java流量控制用户交互ScannerJava.util.Scanner通过Scanner类来获取用户的输入Scanners=newScanner(System.in);next()一定要读取有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才将其输入的空白作为分隔符......
  • [Java基础]collection
    数组与集合区别,用过哪些?数组和集合的区别:数组是固定长度的数据结构,一旦创建长度就无法改变,而集合是动态长度的数据结构,可以根据需要动态增加或减少元素。数组可以包含基本数据类型和对象,而集合只能包含对象。数组可以直接访问元素,而集合需要通过迭代器或其他方法访问元素。......
  • C++笔记4•类和对象3•
    1.初始化列表(1)构造函数再理解:classDate{public:Date(intyear,intmonth,intday){  _year=year;  _month=month;  _day=day;}private:int_year;int_month;int_day;};上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其......
  • 笔记本电脑本地部署ollama大模型(显存不足调用CUDA Unified Memory方法)
    软硬件:win11,NVIDIAGeForceRTX3050显存4g一.ollama模型最低要求1.Llama3.1(8B)模型GPU:至少需要1张具有16GB显存的GPU(例如NVIDIATeslaV100或A100)。CPU:高性能的多核处理器(例如IntelXeon或AMDRyzen)。内存:最少32GB的系统内存。存储:需要大约......