代理模式可以分为动态代理和静态代理两种代理方式。 动态代理相对于静态代理更受推崇。
IBuyInsurance 一个抽象接口,里面有一个或多个抽象方法: BuyInsuranceIml一个抽象接口的实现类,可以直接调用 BuyInsuranceProxy一个实现了抽象接口的代理类,实现了抽象接口的抽象方法,调用到实现类。
BuyInsuranceProxy 静态代理关键代码:
@Override public void buyInsurance(int money,BuyInsuranceCallback callback) { this.callback = callback; int changeMoney = money; if(money>=3000){ // 销售建议可以买两个险种 callback.feedback("推荐您可以购买这三个险种的保险,买这些保险都有哪些益处balaba"); buyInsuranceIml.buyInsurance(1500,callback); changeMoney -=1500; buyInsuranceIml.buyInsurance(1000,callback); changeMoney -= 1000; buyInsuranceIml.buyInsurance(500,callback); changeMoney -= 500; callback.change(changeMoney); }else if(money>=2500){ // 销售建议可以买两个险种 callback.feedback("推荐您购买这两个险种的保险,买这些保险都有哪些益处balabala~~~"); buyInsuranceIml.buyInsurance(1500,callback); changeMoney -=1500; buyInsuranceIml.buyInsurance(1000,callback);// 其实就是买1000的 changeMoney -=1000; callback.change(changeMoney); }else if(money >= 1000){ // 销售建议可以买价位为1000的这个险种 callback.feedback("推荐您购买这个险种的保险,买这份保险都有哪些益处balabala~~~"); buyInsuranceIml.buyInsurance(1000,callback); changeMoney -= 1000; callback.change(changeMoney); }else{ // 销售建议只买得起最低标准的险种 callback.feedback("推荐您购买这个险种的保险,买这份保险都有哪些益处balabala~~~"); buyInsuranceIml.buyInsurance(money,callback); } }IBuyInsurance 一个抽象接口,里面有一个或多个抽象方法: BuyInsuranceIml一个抽象接口的实现类,可以直接调用 BuyInsuranceDynamicProxy一个实现了InvocationHandler接口的代理类,构造函数中使用到了IBuyInsurance接口作为参数。
BuyInsuranceDynamicProxy重写的invoke方法展示:
@Override public Object invoke(Object proxy, Method method, Object[] args) { int money = (int)args[0]; BuyInsuranceCallback callback = (BuyInsuranceCallback) args[1]; int changeMoney = money; if(money>=3000){ // 销售建议可以买两个险种 callback.feedback("推荐您可以购买这三个险种的保险,买这些保险都有哪些益处balaba"); buyInsurance.buyInsurance(1500,callback); changeMoney -=1500; buyInsurance.buyInsurance(1000,callback); changeMoney -= 1000; buyInsurance.buyInsurance(500,callback); changeMoney -= 500; callback.change(changeMoney); }else if(money>=2500){ // 销售建议可以买两个险种 callback.feedback("推荐您购买这两个险种的保险,买这些保险都有哪些益处balabala~~~"); buyInsurance.buyInsurance(1500,callback); changeMoney -=1500; buyInsurance.buyInsurance(1000,callback);// 其实就是买1000的 changeMoney -=1000; callback.change(changeMoney); }else if(money >= 1000){ // 销售建议可以买价位为1000的这个险种 callback.feedback("推荐您购买这个险种的保险,买这份保险都有哪些益处balabala~~~"); buyInsurance.buyInsurance(1000,callback); changeMoney -= 1000; callback.change(changeMoney); }else{ // 销售建议只买得起最低标准的险种 callback.feedback("推荐您购买这个险种的保险,买这份保险都有哪些益处balabala~~~"); buyInsurance.buyInsurance(money,callback); } return null; }动态代理的调用方法展示:
public void dynamicProxyBuyCar(IBuyInsurance buyInsuranceIml,int money){ BuyInsuranceDynamicProxy dynamicProxy = new BuyInsuranceDynamicProxy(buyInsuranceIml); ClassLoader classLoader = buyInsuranceIml.getClass().getClassLoader(); IBuyInsurance buyInsurance= (IBuyInsurance) Proxy.newProxyInstance(classLoader,new Class[]{IBuyInsurance.class},dynamicProxy); Log.d(TAG,"花"+money+"人民币买车"); buyInsurance.buyInsurance(money, this); }