代理设计模式

1:基本概念

2:JDK动态代理  

  1. 创建接口

  

  2. 创建实现类

  3. 创建代理类

/**
* jdk动态代理 不能满足 继承父类的情况
*
* AnimalProxy 代理类
*/
public class AnimalProxy implements InvocationHandler{ /**
* 这里绝对不能使用Dog! 因为我们压根不知道谁是委托类
*/
private Object object; /**
* 给我传递一个委托类,我们返回一个代理类
*/
public Object createProxy(Object target){
this.object=target; //传递dog 委托类就是dog 传递什么 委托类是什么
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
} /**
* 代理类给委托类 工作的方法
* 给 主业务增强
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("====洗洗手====");
Object result= method.invoke(object,args); //有返回值 使用变量接收
System.out.println("====再次洗洗手====");
return result;
} //测试代码
public static void main(String[] args) {
AnimalProxy proxy=new AnimalProxy();
Animal dog= (Animal) proxy.createProxy(new Dog());
dog.eat();
System.out.println("*********************");
dog.sleep();
}
}

  问题:

如果我们上诉案例中的Animal改成了 抽象类,

Dog改成了继承Animal,那么测试代码将会出现错误!

因为JDK动态代理 只支持接口!那么我们就使用CGLIB动态代理!

3:CGLIB动态代理

/**
* CglibProxy 代理类 (接口 + 类)
*/
public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); /**
* 创建代理类对象
*/
public Object createProxy(Class clazz){
//设置公共的接口或者父类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
} /**
* 代理类执行 委托类的 方法
* 系统级业务进行增强
*/
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("====洗洗手====");
Object result= methodProxy.invokeSuper(o,args);
System.out.println("====再次洗洗手====");
return result;
} //测试代码
public static void main(String[] args) {
CglibProxy proxy=new CglibProxy();
Animal dog= (Animal) proxy.createProxy(new Dog().getClass());
dog.eat();
System.out.println("*********************");
dog.sleep();
}
}

    未完待续!!!

      

Spring(八)-- 代理设计模式的更多相关文章

  1. Spring知识点总结(四)之SpringAOP基础 - 代理设计模式

        1. 分析程序中存在的问题(高内聚,低耦合)        通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...

  2. Spring中的设计模式

    [Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用]    [http://www.geek521.c ...

  3. 代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)

    一.代理设计模式 1.设计模式:前人总结一套解决特定问题的代码 2.代理设计模式优点: 2.1 保护真实对象 2.2 让真实对象职责更明确 2.3 扩展 3.代理设计模式 3.1 真实对象(老总) 3 ...

  4. JAVA-Spring AOP基础 - 代理设计模式

    利用IOC DI实现软件分层,虽然解决了耦合问题,但是很多地方仍然存在非该层应该实现的功能,造成了无法“高内聚”的现象,同时存在大量重复的代码,开发效率低下. @Service public clas ...

  5. Java设计模式之——代理设计模式

    1.什么是代理设计模式 所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 这里举一个栗子:就拿我们平时租房子来举例子,好比租客和房主之间的关系,我们租房子往往不 ...

  6. JDK和Spring中的设计模式

    创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3)建造者模式 StringB ...

  7. IOS之Objective-C学习 代理设计模式

    鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...

  8. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  9. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. [Linux系统] (1)常用操作(CentOS 7.x)

    一.Linux系统配置 1.修改主机名 [/etc/hostname] vi /etc/hostname 在其中将旧名字修改为新主机名,保存,重启生效. 2.本地DNS映射 [/etc/hosts] ...

  2. jQuery_val()操作

    完成对输入或者选择内容的获取,以及更改 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  3. AcWing:245. 你能回答这些问题吗(线段树最大子段和)

    给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...

  4. 微信小程序_(视图)简单的swiper容器

    swiper容器效果 官方文档:传送门 swiper容器可实现简单的轮播图效果 结构程序 Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 ...

  5. 【学习】mysql 时间戳与日期格式的相互转换

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Sel ...

  6. (转)mysql基础命令

    Sql代码 asc 按升序排列 desc 按降序排列 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE ...

  7. delete trancate drop三者之间的区别

    简而言之: 删除效果及速度:Drop > truncate > delete 原因: delete,逐行删除,且用日志逐行记录用于回滚,会执行删除触发器:       ------> ...

  8. DAY 3模拟赛

    DAY3 钟皓曦来了! T1 网址压缩 [问题描述] 你是能看到第一题的 friends 呢.           ——hja 众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关 ...

  9. python出现AttributeError: module ‘xxx’ has no attribute ‘xxx’错误时,两个解决办法

    运行python程序时,也许会出现这样的错误:AttributeError: module ‘xxx’ has no attribute ‘xxx’: 解决该错误有两种方法 1.手动安装该模块 2.检 ...

  10. python - yeild

    带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数.比如array.extend函数,它的原型是array.extend(iterable). 带有 ...