代理的名词

代理对象:增强后的对象
目标对象:被增强的对象

Java代理-静态代理

静态代理包含继承和聚合两种。

1. 继承

代理对象继承目标对象,重写需要增强的方法。

public interface UserDao {void query();
}
import org.springframework.stereotype.Service;@Service
public class UserDaoImpl implements UserDao {@Overridepublic void query() {System.out.println("query db");}
}
public class UserDaoLogImpl extends UserDaoImpl {@Overridepublic void query() {System.out.println("start to query");super.query();System.out.println("end to query");}
}
public class TestApp {public static void main(String[] args) {UserDaoImpl dao2 = new UserDaoLogImpl();dao2.query();}
}

`UserDaoLogImpl`是代理对象,`UserDaoImpl`是目标对象。
代理对象与目标对象时相对的,会根据情况发生变化。`UserDaoLogImpl`以后也会成为目标对象。

2. 聚合

import com.merckgroup.msizing.domain.service.UserDao;public class UserDaoOperateImpl implements UserDao {UserDao userDao;public UserDaoOperateImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("operate - start to query");userDao.query();System.out.println("operate - end to query");}
}
public class TestApp {public static void main(String[] args) {UserDao targetUserDao = new UserDaoImpl();UserDaoOperateImpl userDaoOperate = new UserDaoOperateImpl(targetUserDao);userDaoOperate.query();}
}

运行结果:

operate - start to query
query db
operate - end to query

添加时间代理

public class UserDaoTimeImpl implements UserDao {UserDao userDao;public UserDaoTimeImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("time - start to query");userDao.query();System.out.println("time - end to query");}
}

案例

代理1:对日志代理。A
代理2:对操作代理。B
代理3:对时间代理。C

需求:实现对时间和操作的代理。
需求-方案1:采用链式继承,继承B时添加时间代理,继承C时添加操作代理。(继承)
需求-方案2:采用聚合方式

方案1:比较容易实现

方案2:实例代码

public class UserDaoTimeImpl implements UserDao {UserDao userDao;public UserDaoTimeImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("time - start to query");userDao.query();System.out.println("time - end to query");}
}
public class UserDaoOperateImpl implements UserDao {UserDao userDao;public UserDaoOperateImpl(UserDao userDao) { // 装饰者模式this.userDao = userDao;}@Overridepublic void query() {System.out.println("operate - start to query");userDao.query();System.out.println("operate - end to query");}
}
public class TestApp {public static void main(String[] args) {UserDao target = new UserDaoTimeImpl(new UserDaoImpl()); // 对时间UserDao userDaoLog = new UserDaoOperateImpl(target); // 继而对操作userDaoLog.query();}
}

运行结果:

operate - start to query
time - start to query
query db
time - end to query
operate - end to query

结论:使用静态代理时会产生类,继而可能引发类爆炸(继承与聚合皆是如此)。因此,在不确定时尽量减少使用静态代理。

不确定情况:不明确后续的扩展情况,是否需要扩展接口或者扩展接口的程度如何。

Java - 静态代理相关推荐

  1. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

  2. java静态代理与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...

  3. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  4. Java静态代理、动态代理与CGLib代理

    java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...

  5. 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!

    理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 例如,购买火 ...

  6. Java静态代理、动态代理以及CGLIB动态代理

    代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用.对于java的代理模式,一般可分为:静态代理.动态代理.以及CGLIB实现动态代理. 对于上述三种代理模式,分别进行说明. ...

  7. JAVA静态代理与动态代理(JDK和CGLIB)

    代理就是有一些工作你不屑于自己做的,或者不方便自己做的,这个时候你就请别人帮你做,拿我最喜欢的偶像坤坤做例子,他开演唱会肯定不会自己收门票,不会自己清场打扫卫生,所以就需要代理来代替他完成一整场演唱会 ...

  8. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了

    动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...

  9. 啰里吧嗦式讲解java静态代理动态代理模式

    一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...

最新文章

  1. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
  2. 5G NR - 总体架构与物理层
  3. POJ 2724 Purifying Machine (二分图匹配)
  4. C++学习笔记5[函数]
  5. spring中事务配置的3种方式
  6. spring boot Redis集成—RedisTemplate
  7. java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解
  8. oracle12c创建pdb用户6,ORACLE12C PDB创建默认表空间和用户语句
  9. Ubuntu命令行和图形界面选择设置
  10. ubuntu一键安装LAMP 及一键卸载
  11. pandas—dropna
  12. HDU 5900(区间DP)
  13. attention机制_Seq2seq模型中的 Attention机制
  14. 暴风激活工具,劫持Chrome浏览器主页
  15. 如何用python计算行列式_Python入门教程: 计算范德蒙矩阵的行列式
  16. 制作App,免编程积木式搭建如此之简单
  17. HCPL3120手册翻译
  18. uni-app 188修复弹框问题
  19. CIO40知识星球—天道勤酬
  20. 设计师专属的导航网站

热门文章

  1. 实时渲染:实时、离线、云渲染、混合渲染的区别
  2. iOS ping++支付功能实现
  3. 外网做ip映射访问内网链接
  4. Badboy测试工具的使用教程
  5. 数据结构与算法-三对角矩阵的压缩公式推导
  6. 老司机人手必备xxlive 仅供学习交流 勿传播以及商业用途
  7. 华为USG6000V 内网通过NAT地址池访问公网
  8. jQuery的版本比较及使用
  9. [动图演示]Redis 持久化 RDB/AOF 详解与实践 1
  10. #叉积#zoj 1041 poj 1106 ssl 1232 雷达覆盖问题 Transmitters