Welcome everyone

代理模式

设计模式 汪明鑫 342浏览 0评论

代理模式大家都不陌生,在Spring,Mybatis里也经常能看到代理模式的身影。

 

 

被代理的对象可以是远程对象、 创建开销大的对象或需要安全控制的对象

代理模式有不同的形式, 主要有2种 静态代理、 动态代理

 

动态代理有2种方式:jdk,cglib

 

cglib

  • 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只
    是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现
    代理-这就是Cglib代理
  • Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功
    能扩展, 有些书也将Cglib代理归属到动态代理。
  • Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接
    口.它广泛的被许多AOP的框架使用,例如Spring AOP, 实现方法拦截
    在AOP编程中如何选择代理模式:
    1. 目标对象需要实现接口, 用JDK代理
    2. 目标对象不需要实现接口, 用Cglib代理
  • Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类

 

举个简单点的例子来更好地理解代理模式,至于jdk和cglib后续再研究会有博客专门介绍

代理模式主要使用了 Java 的多态,干活的是被代理类,代理类主要是
接活,你让我干活,好,我交给幕后的类去干。
代理类和被代理类实现相同的接口,而且代理类持有被代理对象。
代理类可以代理多个被代理对象。

比如租房中介可以代理多个地区的房子,比如北京西二旗,沙河,昌平镇
我们找房子可以通过正规的租房中介来租,避免被坑,方便。

首先我们看下整体的类图:

上代码:

首先需要一个House的接口

public interface House {
    //出租房子
    public void rentOut();
}

需要被代理对象(真正的房子)实现这个接口

北京西二旗的房子

public class XierqiHouse implements House{
    @Override
    public void rentOut() {
        System.out.println("西二旗的一个房子正在出租 ...");
    }
}

 

北京昌平的房子

public class ChangpingHouse implements House{
    @Override
    public void rentOut() {
        System.out.println("昌平镇的一个房子正在出租...");
    }
}

 

代理对象(租房中介)也需要实现上面的接口,还需要持有被代理对象

public class Agency implements House{

    House house;
    public Agency(House house){
        this.house=house;
    }

    @Override
    public void rentOut() {
        this.house.rentOut();
    }
}

 

最后需要一个人在找房子的类

/**
 * 某个正在找房子的人
 *
 * @author: wangmingxin1
 * @create: 2018-10-30 11:38
 **/
public class SomebodyLookingForHouse {
    public static void main(String[] args){
        //自己找房子,他慢了,而且容易被坑,通过正规的中介来找房子,如链家、蛋壳

        //我想找昌平的房子,便宜啊,new 一个昌平的房子
        ChangpingHouse house =new ChangpingHouse();

        //蛋壳租房中介
        Agency danke =new Agency(house);
        danke.rentOut();    //实际上调用的是ChangpingHouse 的rentOut()方法

        //如果我又想租西二旗的房子了,离公司比较近,在new 一个西二旗的房子,传入代理对象
        XierqiHouse house1 =new XierqiHouse();
        danke =new Agency(house1);
        danke.rentOut();
    }
}

 

 

代理模式的变体

 

 

转载请注明:汪明鑫的个人博客 » 代理模式

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz