首页 > 其他分享 >代理模式--静态代理+动态代理

代理模式--静态代理+动态代理

时间:2023-05-13 10:45:41浏览次数:35  
标签:java -- Object 代理 us 静态 Test public

静态代理

利用程序实现客户通过中介向房东租房的案例:

优缺点理解:

代理模式的具体步骤:

动态代理

同样是以租房为例:

需要代理的类是租房的Rent类:

Rent.java

package org.example.Test;

public interface Rent {
    public void rent();
}

Host.java

package org.example.Test;

public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}

ProxyInvocation.java

package org.example.Test;

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

public class ProxyInvocation implements InvocationHandler {
    //被代理的接口
    private Rent rent;//租房动作需要被代理

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

    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,利用反射机制实现
        Object result=method.invoke(rent,args);
        return result;
    }

    public void setRent(Rent rent){
        this.rent=rent;
    }
}

Client.java

package org.example.Test;

public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host=new Host();

        //代理角色
        ProxyInvocation proxy=new ProxyInvocation();

        //通过调用程序处理角色来处理我们要调用的接口对象
        proxy.setRent(host);

        Rent p=(Rent)proxy.getProxy();
        p.rent();
    }
}

自己利用userService以及userServiceImpl实现动态代理:

userService.java

package org.example.Test;

public interface userService {
    public void oneSelf();
}

userServiceImpl.java

package org.example.Test;

public class userServiceImpl implements userService{
    @Override
    public void oneSelf() {
        System.out.println("测试动态代理");
    }
}

ProxyInvocation.java

package org.example.Test;

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

public class ProxyInvocation implements InvocationHandler {

    private Object us;

    public void setUs(Object us){
        this.us=us;
    }

    private Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), us.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object b=method.invoke(us,args);
        return b;
    }
}

Test.java

package org.example.Test;

public class Test {
    public static void main(String[] args) {
        //真实角色
        userServiceImpl us=new userServiceImpl();

        //代理角色
        ProxyInvocation proxy=new ProxyInvocation();

        proxy.setUs(us);

        us.oneSelf();

    }
}

标签:java,--,Object,代理,us,静态,Test,public
From: https://www.cnblogs.com/liuzijin/p/17396766.html

相关文章

  • 信捷XC系列PLC与7台易能变频器 同时通讯程序 易能变频器通讯控制程序。
    信捷XC系列PLC与7台易能变频器同时通讯程序易能变频器通讯控制程序。程序有注释。可以完成7台易能变频器的通讯。器件:信捷XC3PLC,易能EDS800变频器,触摸屏是昆仑通态。采用信捷XC3的PLC,利用无协议指令,触摸屏控制,同时控制7台变频器频率设定,频率读取。已经用于客户实际生产运行中,通......
  • 【每日一题】[2441. 与对应负数同时存在的最大正整数]
    【每日一题】2441.与对应负数同时存在的最大正整数给你一个不包含任何零的整数数组nums,找出自身与对应的负数都在数组中存在的最大正整数k。返回正整数k,如果不存在这样的整数,返回-1。示例1:输入:nums=[-1,2,-3,3]输出:3解释:3是数组中唯一一个满足题目要求的k......
  • 三菱FX3U与4台三菱变频器专用指令通讯案例 功能:采用三菱FX3U PLC与4台三菱变频器E740
    三菱FX3U与4台三菱变频器专用指令通讯案例功能:采用三菱FX3UPLC与4台三菱变频器E740进行通讯。配件:三菱FX3U的PLC,加FX3U485BD板。三菱E740变频器。昆仑通态触摸屏方式:采用三菱变频器专用通讯指令。效果:控制4台变频器启停,加减速时间设定,频率,电流,电压读取ID:7845593203547594......
  • Java--多线程
    Java--多线程进程线程多线程的实现方式方法1:继承Thread类定义一个类继承Thread方法再该类中重写run()方法创建该类的对象启动线程代码示例类publicclassdemoextendsThread{//继承Thread方法@Overridepublicvoidrun(){//重写run方法,把代码片断......
  • 第五章 5.3.3 构造二叉树
    不同二叉树的遍历序列由不同遍历序列的组合推出原二叉树的结构前序,后序,层序的组合不能推出原结构,因为无法区分左右子树线索二叉树(可称为线索链表)二叉树又可称为二叉链表.中序线索二叉树的存储先序线索二叉树后序线索二叉树三种线索二叉树根据遍历顺序不同,......
  • 最低不被淘汰
    1.在团队博客制作过程中我辅助页面的设计,我花费了大量时间上网查了许多东西,对团队项目的制作有贡献。2.我们团队3人属于都比较菜的,所以在制作过程中需要花费更多时间。3.我个人也因为水平较低原因单独很难完成。......
  • 欧姆龙CP1H与三菱E740变频器 485通讯 CIF11模可直接拿来实用了,采用器件:欧姆龙CP1H PLC
    欧姆龙CP1H与三菱E740变频器485通讯CIF11模可直接拿来实用了,采用器件:欧姆龙CP1HPLC,CP1WCIF11(modbus端口模块)通讯单元,三菱FRE740变频器,1块昆仑通态触摸屏通讯方式:串口网关与变频器进行modbusRTU通讯。功能:触摸屏进行参数设置监控,变频器采用三菱E740,其他凡是支持modbusrtu......
  • 欧姆龙CJ2M 与海利普变频器通讯 协议宏方式可直接拿来实用了,欧姆龙CJ2M PLC与变频器协
    欧姆龙CJ2M与海利普变频器通讯协议宏方式可直接拿来实用了,欧姆龙CJ2MPLC与变频器协议宏通讯采用器件:欧姆龙CJ2M的PLC,1个CJ1WSCU21V1通讯模块,1台海利普HLP-B变频器,通讯方式:欧姆龙通讯模块协议宏功能:通过触摸屏进行启停和点动,频率设定,加减速时间,点动频率设定。同时读取变频器......
  • OpenCV+dlib实现人脸关键点定位
    目录(1)了解工具包(2)加载人脸检测与关键点定位(3)数据预处理(4)人脸检测(5)绘制所有区域本文基于OpenCV并利用dlib工具包实现了对传入图像的人脸关键点定位。步骤:首先需要对传入图像进行预处理操作,其次,利用dlib工具包对整张图像进行人脸检测,然后,对检测到的每一个人脸框利用......
  • 信捷XC PLC与7台海利普变频器 通讯程序案例可直接拿来实用了,信捷XC系列PLC与7台海利普
    信捷XCPLC与7台海利普变频器通讯程序案例可直接拿来实用了,信捷XC系列PLC与7台海利普变频器通讯采用器件:信捷XC系列PLC,多7台海利普HLPB系列变频器,1块昆仑通态MCGS触摸屏。通讯方式:用自由通讯模式方式。特别针对那些老款的变频器功能:对变频器进行频率设定,控制启停,读取输出频率。......