成都网站建设哪个好,手机版网站设计案例,重庆网站建设开发,制作网站的专业公司一、代理模式#xff08;Proxy#xff09;
1.代理模式的定义
代理模式给某一个对象提供一个代理对象#xff0c;并由代理对象控制对真实对象的访问#xff0c;起到对代理对象已有功能的增强
通俗的来讲代理模式就是我们生活中常见的中介。
2.作用
中介隔离作用#x…一、代理模式Proxy
1.代理模式的定义
代理模式给某一个对象提供一个代理对象并由代理对象控制对真实对象的访问起到对代理对象已有功能的增强
通俗的来讲代理模式就是我们生活中常见的中介。
2.作用
中介隔离作用在某些情况下一个客户类不想或者不能直接引用一个委托对象
而代理类对象可以在客户类和委托对象之间起到中介的作用其特征是代理类和委托类实现相同的接口。
开闭原则增加功能代理类除了是客户类和委托类的中介之外我们还可以通过给代理
类增加额外的功能来扩展委托类的功能这样做我们只需要修改代理类而不需要再修改委托类符合代码设计的开闭原则。
3.代理模式的分类
我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种
静态代理:
静态代理是由程序员创建或特定工具自动生成源代码在对其编译。在程序员运行之前代理类.class文件就已经被创建了。
动态代理:
动态代理是在程序运行时通过反射机制动态创建的。 动态代理分为: 基于接口的动态代理jdk自带 基于子类的动态代理第三方 二、静态代理
所谓“静态 ”也就是在程序运行前就已经存在代理类的字节码文件代理类和被代理对象的关系在运行前就确定了。 1.定义接口
interface ISinger{public void sing();
}
2.定义被代理类
public class SingerImp implements Isinger{Overridepublic void sing(){Systm.out.println(莫等闲);}
}
3.定义代理类
public class SingerProxy implements Isinger{Isinger realsinger;public SingerProxy(Isinger realsinger) {this.realsinger realsinger;}Overridepublic void sing(){Systm.out.println(大家好);realsinger.sing();Systm.out.println(谢谢);}
}
4.定义客户端查看执行结果
public class Test {public static void main(String[] args) {//1.创建被代理对象Isinger realsinger new SingerImp();//2.创建代理Isinger proxysinger new SingerProxy(realsinger);proxysinger.sing();}
} 输出结果 大家好 莫等闲 谢谢 从上面的代码可以看出静态代理存在被代理类和代理类之间耦合度过高。
三、动态代理
“动态”代理的源码是在程序运行期间由 JVM 根据反射等机制动态的生成所以在运行前并不存在代理类的字节码文件。
1.使用JDk 1.1 定义接口
interface ISinger{public void sing();
}
1.2 定义被代理类
public class ZhaoYiTing implements ISinger{Overridepublic void sing() {System.out.println(易燃易爆炸);}
}
1.3 定义客户端查看执行结果
public class test01 {public static void main(String[] args) {//1.创建被代理对象ISinger zhaoYiTing new ZhaoYiTing();//2.创建代理对象ISinger jinjiren (ISinger)Proxy.newProxyInstance(zhaoYiTing.getClass().getClassLoader(), zhaoYiTing.getClass().getInterfaces(), new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//功能增强System.out.println(自我介绍);Object obj method.invoke(zhaoYiTing, args);return obj;}});jinjiren.sing();}
} 输出结果 自我介绍 易燃易爆炸 2.使用第三方CGLIB 2.1 定义接口
interface ISinger{public void sing();
}
2.2 定义被代理类
public class ZhaoYiTing implements ISinger{Overridepublic void sing() {System.out.println(莫等闲);}
}
2.3 定义客户端查看执行结果
public class test {public static void main(String[] args) {ISing imp new tenggeerImp();ISing jin (ISing)Enhancer.create(imp.getClass(), imp.getClass().getInterfaces(), new InvocationHandler() {Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {Object obj method.invoke(imp, objects);return obj;}});jin.sing();}
} 输出结果 莫等闲