java代理模式中的动态代理与静态代理笔记

反射技术中有两个很重要的部分,一个是注解,一个是动态代理,刚刚学完代理模式,做一个笔记记录一下~
什么是代理模式呢,生活中最常见的代理模式应该就是房租中介了吧,
房地产商提供房源,中介与顾客接触,而房地产商不是与顾客直接接触,这样就形成了一种代理模式(原谅一下灵魂画手哈)
在这里插入图片描述
有几点需要注意一下:
1.顾客只关心房地产商的房子,而不关心是谁在卖
2.代理是房租中介,顾客通过中介接触房子

静态代理中,我们可以把房地产商看作一个接口,然后呢,底下有它的实现类,房子(真正实现接口的实现类),代理人,中介(虽然实现了接口,但是却是调用了房子),两个一同实现了房地产商接口。
(房地产商接口)

/**
 * Created on 00:21  13/08/2019
 * Description:
 *
 * @author Weleness
 */
public interface SellHouse {
    void sell();
}

(房子实现类)

**
 * Created on 00:22  13/08/2019
 * Description:
 *
 * @author Weleness
 */

public class RealHouse implements SellHouse {
    @Override
    public void sell() {
        System.out.println("我是三环外的房子");
    }
}

(房租中介,拿到房子,向顾客推销)

/**
 * Created on 00:22  13/08/2019
 * Description:
 *
 * @author Weleness
 */

public class SellProxy implements SellHouse {
    RealHouse realHouse;

    public SellProxy(RealHouse realHouse) {
        this.realHouse = realHouse;
    }

    @Override
    public void sell() {
        realHouse.sell();

        zhongjie();

        zhongjie2(false);
        zhongjie2(true);
    }

    public static void zhongjie() {
        System.out.println("我们卖的房子啊,风景好,冬暖夏凉");
    }


    public static void zhongjie2(boolean isBuy) {
        if (isBuy)
            System.out.println("感谢您的惠顾,这是您的房产证");
        else
            System.out.println("您再考虑一下嘛,三环哦,交通方便,气候适宜");
    }
}

(测试代码以及测试结果)

/**
 * Created on 00:27  13/08/2019
 * Description:
 *
 * @author Weleness
 */

public class Test2 {
    public static void main(String[] args) {
        RealHouse realHouse = new RealHouse();

        SellProxy sellProxy = new SellProxy(realHouse);

        sellProxy.sell();
    }
}

在这里插入图片描述
代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。
什么叫做静态呢?因为它的类型是事先预定好的,比如上面代码中的 SellProxy这个类。
好了,介绍完静态代理,我们来介绍一下动态代理

首先,动态代理在目的上和静态代理是没有区别的,唯一有区别的就是静态和动态之分。
什么是动态呢,我们通过代码来看下
还是卖房子这个问题
不过这次中介人不是我们指定的了,是由中介公司给你分配的

/**
 * Created on 00:31  13/08/2019
 * Description:
 *
 * @author Weleness
 */

public class ZhongjieRen implements InvocationHandler {
    Object fangzi;

    public ZhongjieRen(SellHouse fangzi) {
       this.fangzi = fangzi;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("你好我是中介,为你介绍这款房子");
        method.invoke(fangzi,args);
        System.out.println("销售结束");
        return null;
    }
}

这个InvocationHandler接口是什么呢,我待会解释
然后我们就可以开始买房子了

/**
 * Created on 00:35  13/08/2019
 * Description:
 *
 * @author Weleness
 */

public class SellFactory {
    public static void main(String[] args) {
        BeiSanhuan beiSanhuan = new BeiSanhuan();

        InvocationHandler fangzi = new ZhongjieRen(beiSanhuan);

        SellHouse sellHouse = (SellHouse) Proxy.newProxyInstance(BeiSanhuan.class.getClassLoader(),BeiSanhuan.class.getInterfaces(),fangzi);
        sellHouse.Sell();;
    }
}

在这里插入图片描述
在这里,我并没有去创建了一个继承SellHouse接口的代理类,也可以调用到sell方法,这就是所谓的**“动态”**
动态代理中,主要涉及到两个东西,InvocationHandler接口,和Proxy类,
InvocationHandler接口主要是让其实现类实现它里面的规范,相当于标记的作用,当Proxy类调用newProxyInstance方法,
传递被代理对象的类加载器,被代理对象实现的接口,以及被InvocationHandler接口标记的实现类,当被代理对象的方法被调用。Proxy会通过传进去的接口通过反射动态生成一个实现类,这个实现类又通过InvocationHandler中的invoke方法,调用被代理对象的方法,从而达到代理的目的。

以上是我个人的理解,有错误的地方请多纠正,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值