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修饰)

钩子方法是父类给出了默认实现,但子类也可以重写的方法。

最新文章

  1. Python之路【第四篇】python基础 之基本数据类型之集合
  2. PLC M8000 M8001 M8002 M8003
  3. Ubuntu下apt-get命令详解
  4. VM虚拟机下安装Centos7.0图文教程
  5. Java中Stringbuffer、Arrays、Interger、Character类的特性
  6. [fun code - 模拟]孤独的“7”
  7. linux笔记_20150825_linux下的软件工具唠叨下
  8. Android Studio开发RecyclerView遇到的各种问题以及解决
  9. [原创] zabbix学习之旅三:agent安装
  10. ubuntu14.04启动提示set_sw_state failed
  11. c# 基础复习1
  12. Material Design之FloatingActionButton的使用
  13. C#中string的小结
  14. php cookies自动登录
  15. c语言中的#ifdef和#ifndef
  16. 介绍Dynamics 365 Performance Center
  17. .net core实践系列之短信服务-架构设计
  18. 关于Jedis是否线程安全的测试
  19. PyTorch中的backward [转]
  20. 对int array进行排序

热门文章

  1. Dockerfile的HEALTHCHECK指令
  2. 修改mongodb(带仲裁节点的副本集)各机器端口
  3. bzoj1001狼抓兔子 对偶图优化
  4. UVA11997 K Smallest Sums
  5. jackson中@JsonProperty、@JsonIgnore等常用注解总结
  6. Spring AOP @Before @Around @After 等 advice 的执行顺序
  7. [Hibernate] One-To-Many 配置文件和注解的方式以及HQL语句
  8. linux存储管理之自动挂在
  9. Annotations
  10. 拒绝服务(DoS)理解、防御与实现