1.使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。
2.静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立
3.SomeServiceProxy和SomeServiceImpl都实现ISomeService接口,并且SomeServiceProxy依赖于实现了ISomeService接口的目标类
4.动态代理
JDK的Proxy:
目标类必须要实现接口
final ISomeService target = new SomeServiceImpl(); ISomeService proxy = (ISomeService) Proxy.newProxyInstance(target .getClass().getClassLoader(), // 目标类的类加载器 target.getClass().getInterfaces(), // 目标类所实现的所有接口 new InvocationHandler() { // 匿名内部类 // proxy:代理对象 // method:目标方法 // args:目标方法的参数列表 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub Object result = method.invoke(target, args); if(result!=null) result = ((String) result).toUpperCase(); return result; } }); String result = proxy.doFirst();
CGLIB动态代理:
通过继承实现功能增强,要求目标类能被继承
采用方法回调设计模式:就是类A调用类B中的某个方法b,然后类B又再某个时候反过来调用类A中的某个方法a,对于A来说,这个a方法便叫做回调方法
package com.travelsky.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class MyCglibFactory implements MethodInterceptor{ private SomeService target; public MyCglibFactory() { super(); // TODO Auto-generated constructor stub target=new SomeService(); } public SomeService myCglibCreator(){ //创建增强器对象 Enhancer enhancer = new Enhancer(); //指定目标类,即父类 enhancer.setSuperclass(SomeService.class); //设置回调接口对象 enhancer.setCallback(this); return (SomeService) enhancer.create(); } //回调方法 @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub Object result = method.invoke(target, args); if(result!=null){ result = ((String)result).toUpperCase(); } return result; } }
5.java命令启动java虚拟机:
1)启动虚拟机:D:\SoftwareInstalled\jdk1.7\jre\bin\server\jvm.dll
2)启动类加载器:Bootstrap ClassLoader:D:\SoftwareInstalled\jdk1.7\jre\lib\rt.jar
3)扩展类加载器:extension ClassLoader:D:\SoftwareInstalled\jdk1.7\jre\lib\ext\*.jar
4)应用程序类加载器:Application ClassLoader:负责加载用户类路径(ClassPath)上所指定的类库。
6.适配器模式
7.模板方法设计模式
在模板方法设计模式中,存在一个父类。其中包含两类方法:模板方法与步骤方法。
模板方法,即实现某种算法的方法步骤和框架,都是通过调用步骤方法完成的。
步骤方法,即完成模板方法的每个阶段性的方法。每个步骤方法完成某一特定的、完成总算法的一部分功能。步骤方法有三种类型:抽象方法、最终方法、与钩子方法。
抽象方法是要求子类必须实现的方法,是完成模板方法的算法步骤中必须由子类完成的个性化定义。
最终方法是子类不能重写的方法,是若要完成模板方法的算法步骤,对于所有子类执行都一样的步骤。(用final修饰)
钩子方法是父类给出了默认实现,但子类也可以重写的方法。