Java代理模式示例程序

当然不是我想出来的,是我看的一个网上教程里的。

模拟的是一个对电脑公司的代理

  • 真实类的接口:

    public interface SaleComputer {
    
        public String sale(double money);
    
        public void show();
    }
  • 真实类:

/**
* 真实类
*/
public class Lenovo implements SaleComputer {
//真实类要实现接口
@Override
public String sale(double money) {//定义了含参一个方法 System.out.println("花了"+money+"元买了一台联想电脑...");
return "联想电脑";
} @Override
public void show() {//定义了一个无参方法
System.out.println("展示电脑....");
}
}
  • 代理类

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) {
    //1.创建真实对象
    Lenovo lenovo = new Lenovo(); //2.动态代理增强lenovo对象
    /*
    三个参数:
    1. 类加载器:真实对象.getClass().getClassLoader()
    2. 接口数组:真实对象.getClass().getInterfaces()
    3. 处理器:new InvocationHandler(),一般使用匿名内部类创建
    */
    SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /*
    代理逻辑编写的方法:代理对象调用的所有方法都会触发invoke执行
    参数:
    1. proxy:代理对象
    2. method:代理对象调用的方法,被封装为的对象
    3. args:代理对象调用的方法时,传递的实际参数
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    /*System.out.println("该方法执行了....");
    System.out.println(method.getName());
    System.out.println(args[0]);
    */
    //判断是否是sale方法,针对真实类不同的方法来设置不同的代理
    if(method.getName().equals("sale")){
    //1.增强参数
    double money = (double) args[0];
    money = money * 0.85;
    System.out.println("专车接你....");
    //使用真实对象调用该方法,获取返回值
    String obj = (String) method.invoke(lenovo, money);//使用method.invoke()方法
    System.out.println("免费送货...");
    //2.增强返回值
    return obj+"_鼠标垫";
    }else{//对于不需要增强的方法,直接使用method.invoke()传递给原对象的方法
    Object obj = method.invoke(lenovo, args);
    return obj;
    }
    }
    }); //3.调用方法 /* String computer = proxy_lenovo.sale(8000);
    System.out.println(computer);*/ proxy_lenovo.show();//访问代理对象而不是原对象
    }
    }

实际上,被代理的不一定是对象,一个接口也可以。这样方法就都在代理对象中实现了

Java代理模式示例程序的更多相关文章

  1. Java代理模式

    java代理模式及动态代理类 1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...

  2. 浅谈java代理模式

    讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...

  3. java 代理模式 总结

    1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...

  4. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...

  5. Java代理模式,一次复习完4种动态代理实现方式

    代理模式也是一种非常常见的设计模式.了解Spring框架的都知道,Spring AOP 使用的就是动态代理模式.今天就来系统的重温一遍代理模式. 在现实生活中代理是随处可见的,当事人因某些隐私不方便出 ...

  6. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  7. 18 java 代理模式 (转)

    静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...

  8. JAVA 代理模式(Proxy)

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

  9. Java代理模式——静态代理模式

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

随机推荐

  1. CentOS 7下安装Redis

    1.安装gcc环境 sudo yum install gcc-c++ 2.安装wget sudo yum install wget 3.下载Redis源码包 wget http://download. ...

  2. <javaScript>document.body为null的问题

    虽然body是JS中的DOM技术中所有浏览器支持的属性,但在我们的代码编写中,还是会碰到document.is null问题 例如:我们可以使用alert(document.body);的时候,就会提 ...

  3. C#-片段:外侧代码

    ylbtech-C#-片段:外侧代码 1.返回顶部 ·#if #if true #endif ·#region #region MyRegion #endregion ·namespace names ...

  4. VS2015编译gdal库

    gdal下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource 修改nmake.opt中的一些配置.1. GDAL_HOME = “C:\warmerd ...

  5. 阶段5 3.微服务项目【学成在线】_day18 用户授权_18-微服务之间认证-需求分析

    4.1 需求分析 前边章节已经实现了用户携带身份令牌和JWT令牌访问微服务,微服务获取jwt并完成授权. 当微服务访问微服务,此时如果没有携带JWT则微服务会在授权时报错. 测试课程预览: 1.将课程 ...

  6. 处理线上CPU负载过高的故障现象

    如何处理线上CPU100%的故障现象 处理流程: 1.登陆线上机器top命令,查看耗费cpu的进程号,举例来说发现进程24008持续耗费资源 2.top -Hp 24008去查看持续耗费cpu的线程号 ...

  7. 关于appium操作真机打开app之后无法定位页面元素的问题的解决办法

    appium操作真机打开app后无法定位页面元素:例如微信或者支付宝支付时,手机的安全控件会对支付环境进行保护,会断掉当前appium与真机的链接,导致连接失败,无法定位到页面元素,在做ui自动化之前 ...

  8. mysql定时任务event——清理过期数据 (转)

    1.查询是否开启事件调度 SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件调度 临时: SET GLOBAL event_scheduler = 1; 永久: ...

  9. python检测音频中的静音

    #-*- coding: utf-8 -*- import os import wave from time import sleep import numpy as np SUCCESS = 0 F ...

  10. 欧姆龙NX1P 输送马达功能块

    一个简单的马达输送轨道功能块,需要的小伙伴可以参考下,个人能力有限,不足的地方还请包涵. 下载链接:https://pan.baidu.com/s/1V1gioE0boDpaUsR5cqQ5dg