动态代理

代理模式

(Proxy Pattern)是设计模式的一种,在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于代理模式。
举个生活中的例子:在租房子的时候,房东可以租房,二房东也能够租房。两者执行的功能是一样的,就构成了代理模式;

动态代理

代理模式根据创建的时间分为静态代理动态代理;其中代理类在程序运行时创建代理类的代理方式称为动态代理;以后动态代理更为常用,所以今天介绍一下动态代理。
还是以房东与二房东的关系为例子来解释;

实现步骤

1.代理对象与真实对象实现相同的接口‘
2.代理对象用newProxyInstance()方法创建
3.代理对象调用方法;
4.增强方法;

用代码来实现就是:

接口 rent:
房东 landlord类  实现rent接口,进行租房
二房东  middleman类 也实现rent接口,进行租房
import com.sun.deploy.security.SelectableSecurityManager;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {
        SaleMan saleMan=new SaleMan();
        /**
         * newProxyInstance的参数列表是固定格式,不用过分纠结
         * 返回值是Object,但可以强制类型转换成接口
         */
        Lenovo SecondAgent = (Lenovo) Proxy.newProxyInstance(SaleMan.class.getClassLoader(), SaleMan.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("sale")) {
                    //是sale方法
                    double price = (double) args[0] * 2.0;//增强方法,修改参数
                    String obj =(String) method.invoke(saleMan, price);
                    //method.invoke()调用真实对象方法
                    return obj+"。。。。。。。。。现在有点亏";
                } else {
                    Object invoke = method.invoke(saleMan, args);
                    return invoke;
                }
            }
        });
        System.out.println(SecondAgent.sale(8000));
        SecondAgent.show();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值