新手自学上路, 肤浅理解, 见谅
项目结构
约定的接口 Sell 文件
package com.fmg.sells; // 价格类, 所以厂家都必须实现这个类, 来交流价格 public interface Sell { float sell(int num); }
实现的厂家 Xinhua文件
package com.fmg.factory; // 新华 卖书, 实现 Sell 类 // 平均一本书是 9.9 元, num 本书就是 9.9 * num 元 import com.fmg.sells.Sell; public class XinHua implements Sell { @Override public float sell(int num) { return 9.9f * num; } }
测试的文件 testMain文件
package com.fmg; // 测试类 // 因为我从新华批量买书, 肯定是为了赚利润, 所以我的出售价格肯定是在原价上面加钱 // 所以不能直接调用 factory 里面的 XinHua 接口, 不然就白忙活了 // 所以需要用到代理, 代理从新华买了书, 价格进行从新计算后, 返给我, 我再卖, 赚利润 import com.fmg.factory.XinHua; import com.fmg.handle.XinHuaProxy; import com.fmg.sells.Sell; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class TestMain { public static void main(String[] args) { // 这里用多态, 因为都实现了 Sell 类 Sell sell = new XinHua(); // 创建 InvocationHandler InvocationHandler invocationHandler = new XinHuaProxy(sell); // 获取类文件 Class myClass = sell.getClass(); // 创建代理 /** * 第一个参数, 需要代理的类的 类加载器 * 第二个参数, 需要代理的类的 接口(这就是为什么JDK代理必须实现interface了) * 第三个参数, invocationHandler 处理器, 通过这个对代理对象的结果进行加工, 拓展(功能增强) */ Sell proxy = (Sell)Proxy.newProxyInstance(myClass.getClassLoader(), myClass.getInterfaces(), invocationHandler); // proxy 等同于 一个实现了 Sell 接口的 接口 Object res = proxy.sell(10); // 厂家卖书 9.9元一本, 我进货10本, 买了 118.8, 转了十几块 System.out.println(res); // 结果 118.8 } }
代理 XinHuaProxy 处理函数
package com.fmg.handle; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class XinHuaProxy implements InvocationHandler { // target私有类对象, 调用哪个对象里面的方法, 这个target就是哪个类 private Object target = null; // 类对象通过构造函数获取 public XinHuaProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * proxy: 可以不用管它, 用不上 * method: 方法名, 最后使用的时候调用 * args: 参数数组, 直接当参数用就行, 也是最后使用的使用传入 */ Object res = method.invoke(target, args); // 强转浮点型, 因为价格肯定是一个 浮点数 float price = (float)res; // 功能增强 (在价格上赚点利润, 商家嘛!赚20% 不过分吧) price = price * 1.2f; return price; } }
逻辑图, 想学好程序, 就要会画图, 能 "实例化" 的知识才是 最靠谱的东西
因为本人是前端入门的, 所以很多时候会把 方法(java) 叫 函数(前端) , 其实 两个是一样的东西