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. Leetcode: Sum of Two Integers && Summary: Bit Manipulation

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  2. java-mybaits-012-mybatis-Interceptor-拦截器读写分离四种实现方案

    一.概述 基本项目搭建 技术框架:spring web mvc .日志[slf4j.log4j2].mybatis.druid.jetty插件启动.mybatis-generator逆向配置生产dao ...

  3. 初始化jsp页面下拉选备选项【我】

    将下列 script标签放到页面的最下端 <!-- 初始化的全局变量,供js中使用,主要拼接下拉选的初始化值 --> <script type="text/javascri ...

  4. 请求头User-Agent作用?

    请求头User-Agent作用 答: User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头,是一种向访问网站提供你所 ...

  5. Qt编写自定义控件39-导航标签

    一.前言 在很多菜单导航界面中,当单击了二级菜单或者三级菜单以后,顶部会显示带箭头或者其他标识的导航标签,可以单击该标签快速切换到对应的界面,也作为指示当前处于哪一级菜单下的界面,主要在WEB中大肆流 ...

  6. linux简单命令4---压缩与解压

    1:压缩命令:zip 2:.gz压缩,不能压缩目录,会压缩目录里的文件 3:.bz2压缩,不能压缩目录,直接报错 ------------------------------------------- ...

  7. 一百三十九:CMS系统之首页帖子列表布局

    # 配置ueditor上传文件到七牛UEDITOR_UPLOAD_TO_QINIU = True # 设置为True是,视为开始把图片传到七牛储存,本地不储存UEDITOR_QINIU_ACCESS_ ...

  8. 第十一章 缓存机制——《跟我学Shiro》

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2029217 跟我学Shiro  目录贴:跟我学Shiro目录贴 Shiro提供了类似于Spri ...

  9. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  10. Python练手项目:20行爬取全王者全英雄皮肤

    引言    王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ...