Skip to content

设计模式之代理模式(动态代理,静态代理)

Notifications You must be signed in to change notification settings

elspet/ProxyPattern

Repository files navigation

ProxyPattern

代理模式可以分为动态代理和静态代理两种代理方式。 动态代理相对于静态代理更受推崇。

一、静态代理

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);
    }

About

设计模式之代理模式(动态代理,静态代理)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages