首页 > 编程语言 >Java基础知识回顾10-代理模式

Java基础知识回顾10-代理模式

时间:2023-11-14 22:33:48浏览次数:42  
标签:10 Java 角色 对象 代理 接口 基础知识 实现 public

一、简介

代理模式是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

优点:

1.职责清晰:真实角色就是实现实际业务逻辑,不用关心其他非本职的事务,通过后期的代理完成一件完成事务。

2.保护对象: 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

二、模式结构

一个是真正的你要访问的对象,一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。代理模式分为静态代理和动态代理。

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

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

三、静态代理

创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法,之后再创建一个代理类,同时使其也实现这个接口,在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。

1.定义业务接口

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 定义业务接口
 */
public interface DogService {

    void eat();
}

2.目标实现类 + 实现业务功能

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 目标实现类 + 实现业务功能
 */
public class Dog implements DogService {
    @Override
    public void eat() {
        System.out.println("狗吃狗粮");
    }
}

3.代理实现类+ 增强功能访问

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 代理实现类+ 增强功能访问
 */
public class DogSuper implements DogService {
    @Override
    public void eat() {
        System.out.println("狗可以自己找骨头");
        // 使用代理类
        Dog dog = new Dog();
        dog.eat();
    }
}

四、动态代理

代理类:利用反射机制在运行时创建代理类。接口、被代理类不变,我们构建一个ProxyInvocationHandler类来实现InvocationHandler接口。

package day02;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author qx
 * @date 2023/10/27
 * @des
 */
public class ProxyInvocationHandler implements InvocationHandler {
    private Object target;

    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     * 生成得到代理类
     *
     * @return
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName());
        // 动态代理的本质就是使用反射机制来实现
        return method.invoke(target, args);
    }
}

创建业务接口:

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 定义业务接口
 */
public interface DogService {

    void eat();
}

创建目标实现类:

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 目标实现类 + 实现业务功能
 */
public class DogServiceImpl implements DogService {
    @Override
    public void eat() {
        System.out.println("狗吃狗粮");
    }
}

动态代理测试:

package day02;

/**
 * @author qx
 * @date 2023/10/27
 * @des 多态代理测试
 */
public class ProxyTest {
    public static void main(String[] args) {
        // 真实角色
        DogService dogService = new DogServiceImpl();

        // 代理角色
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
        // 通过调用程序处理角色来处理我们要调用的接口对象
        proxyInvocationHandler.setTarget(dogService);

        DogService proxy = (DogService) proxyInvocationHandler.getProxy();
        proxy.eat();
    }
}

输出:

eat
狗吃狗粮

标签:10,Java,角色,对象,代理,接口,基础知识,实现,public
From: https://blog.51cto.com/u_13312531/8379599

相关文章

  • 第10章 数组和指针
    1、例如:intarray[6]={1,2,3,4,5};,array[n],数组长度为5,n取值范围[0,n-1],就是1-5的地址;2、指针指代数组:#include<stdio.h>intmain(){/*带有5个元素的整型数组*/doublebalance[5]={1000.0,2.0,3.4,17.0,50.0};double*p;inti;......
  • Java集合—HashMap
    HashMap简介HashMap是一个散列表,它存储的内容是键值对(key-value)映射。HashMap实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。HashMap是无序的,即不会记录插入的顺序。HashMap继承于AbstractMap,实现了Map、Clone......
  • java 面向对象进阶 static
    1.工具类packagenet.elaina.a02staticdemo2;publicclassArrayUtil{//私有化构造方法//目的:为了不让外界创建他的对象privateArrayUtil(){}//需要定义为静态的,方便调用publicstaticStringprintArr(int[]arr){StringB......
  • JavaScript知识点
    JavaScript中的虚值constfalsyValues=["",0,null,undefined,NaN,false];简单的来说虚值就是是在转换为布尔值时变为false的值。如何检查值是否虚值使用Boolean函数或者!!运算符。usestrict"usestrict”是ES5特性,它使我们的代码在函数或整个脚本中处于严格模式。严格模式帮助......
  • 天合光能光伏发电效果如何?淮安二期10GW+10GW全面投产
    秋风送爽,也送来天合光能淮安基地的双重喜讯:10月17日,天合光能淮安基地二期10GW至尊N型2382mm标准尺寸组件成功下线,最高功率达610W;10月20日,二期10GWN型i-TOPCon电池成功下线。这标志着,淮安基地二期项目实现全面投产,天合光能N型量产步伐持续加速,将进一步放大至尊N型2382标准尺寸......
  • 天合光能工商业屋顶应用值得投资?江西光伏项目每年可省下2100万!
    近日,由天合光能供货的江西上饶德隆纺织有限公司屋顶光伏项目第一期成功并网。该项目是所在县内最大的工商业屋顶光伏项目,总规模28MW,全部采用天合光能至尊600W+系列超高功率组件。项目整体并网后,预计年平均发电量超27,500万度,减排二氧化碳22,880吨,相当于年植树1,271,112棵,每年可......
  • Oracle启动数据库报ORA-01102解决办法
    1.机器启动之后登录服务器使用sqlplus/assysdba登录数据库发现数据库并没有启动之前把数据库服务添加过开机自启动![在这里插入图片描述](https://img-blog.csdnimg.cn/c25a5e40f3274621b708d974065bf650.png)2.使用startup命令启动数据库报错了SYS@orcl>startup;ORACLE例程已......
  • 一个常见的 JavaScript 解构陷阱
    在日常的JavaScript编码中,我们经常使用解构语法来提取对象中的属性。假设我们有一个名为fetchResult的对象,代表从接口返回的数据,其中包含一个字段名为data。constfetchResult={data:null};在提取data字段时,为了避免接口未返回该字段而导致的问题,我们常常会使用......
  • JavaDoc生成文档(也就是文档注释)
    一、JavaDoc1.javadoc命令是用来生成自己API文档的2.参数信息@author作者名@version版本号@since指明需要最早使用的jdk版本@param参数名@return返回值情况@throws异常抛出情况 ......
  • java 使用documents4j将word转pdf
    documents4j简介document4j是一个用来进行文档格式转换的Java工具库,它通过借助本机中支持指定文件格式到目标文件格式转换的应用,来实现整个转换的过程。document4j实现了MicrosoftWord、Excel的适配功能,可以将docx文件转换为pdf文件,并且在这个过程中不会出现非微软文件转换出......