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. python 设计模式之迭代器模式

    #写在前面 真的有一大把年纪了,回头看看, 明明也很努力,却发现自己穷的一无所有,昨夜的事更是让我眼泪止不住的流,眼睛也肿了,委屈的愣是说不出一个字.前面荆棘丛生,身后已无退路,生活一地鸡毛,糟糕的一 ...

  2. java中 int、char、long各占多少字节数

    所谓的占用字节数 就是申请内存的时候所占的空间大小 byte    1字节 最小值是 -128(-2^7):    最大值是 127(2^7-1): boolean    至少1字节 这种类型只作为一 ...

  3. MeasureSpec常用方法

    package com.loaderman.customviewdemo; import android.content.Context; import android.util.AttributeS ...

  4. 编译安装MySQL5.6

    安装必需的工具  比如cmake.gcc.g++.git CentOS使用下面的命令: yum install cmake gcc g++ git Ubuntu使用下面的命令: apt-get ins ...

  5. git帮助和小结

    获取帮助 想了解 Git 的各式工具该怎么用,可以阅读它们的使用帮助,方法有三: $ git help <verb> $ git <verb> --help $ man git ...

  6. Python基础之set集合与函数

    set集合 集合是一个无序且不重复的元素组合,以大括号表示.使用详情: >>> b=set(a) >>> type(b) <class 'set'> & ...

  7. python之socket编程(二)

    标签(空格分隔): socket编程 SocketServer解析 SocketServer内部使用I/O多路复用,多线程,多进程来实现客户端多并发访问Socket服务端,while循环时使用I/O多 ...

  8. Intellij-编译

    目录 IntelliJ IDEA 编译方式介绍 编译方式介绍 编译触发按钮 运行之前的编译 @(目录) IntelliJ IDEA 编译方式介绍 编译方式介绍 相比较于 Eclipse 的实时自动编译 ...

  9. win7下docker环境安装

    最近公司涉及到对docker容器引擎的使用,所以就在网上各种搜索,由于是win7系统,所以在使用上更是麻烦,遇到各种错误就是无法成功启动docker,经过两天的各种尝试下,终于安装成功,在此记录一下使 ...

  10. python的jenkins三方包

    jenkinsapi 比较重,实现不好 python-jenkins 比较轻,建议使用,可以进行二次开发和封装