代理模式大家都不陌生,在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();
}
}
代理模式的变体
说点什么
您将是第一位评论人!