动态代理模式详解
时间:2020-04-12
本文章向大家介绍动态代理模式详解,主要包括动态代理模式详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式
代理模式的好处
- 可以使真是角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就是交给代理角色,实现了业务的分工
- 公共业务发生扩展的时候,方便集中管理
缺点
- 一个真实的角色会产生一个代理角色:代码量翻倍,开发效率降低
下面用房子出租案例说明代理模式
房东出租房子,真实角色比如(你)要租房子,房东出租房子要贴广告啊,发布信息啊,找到租户之后还要谈价格签合同啊,房东作为包租婆太懒了,这点小活都不愿意干,于是,她把这个任务交给你了中介,让中介来帮他寻找需要租房子的客户等等一些杂七杂八的活,而他只需要在家吃着西瓜追剧就行啦。而真实客户呢,要想要租房,那就必须得跟中介谈。
少废话直接上代码
先来一个Rent接口,因为各方都需要租房这个业务,面向接口编程啦
public interface Rent {
public void rent();
}
房东要出租了,中介你帮我骗几个大学生过来租房子
public class Host implements Rent {
public void rent(){
System.out.println("我要出租房子");
}
中介想要挣钱,必须要收中介费,不然我干嘛要帮你干活
public class Proxy implements Rent {
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host=host;
}
public void rent(){
host.rent();
seeHouse();
goodHouse();
heTong();
proxyMoney();
}
public void seeHouse(){
System.out.println("带你去看房子!");
}
public void goodHouse(){
System.out.println("这个房子好啊~");
}
public void heTong(){
System.out.println("签立合同!");
}
public void proxyMoney(){
System.out.println("你要交中介费");
}
}
你要租房
public class Client {
public static void main(String[] args) {
//代理模式
Host host=new Host();
Proxy proxy=new Proxy(host);
proxy.rent();
}
}
看到这里相信你对代理模式有点熟悉了吧,接下来用一个业务的代码带你再次了解静态代理的思路
- 假如有一个实现了增删改查的业务代码,现基础上要添加一个log4j的功能,要求不能改动原有的业务代码。这时候就能发挥到静态代理的功能性了
- 啥也别说了,上代码
老套路,来一个接口,然后实现它
public interface UserService {
public void add();
public void delete();
public void update();
public void select();
}
实现增删改查的功能
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("add");
}
public void delete() {
System.out.println("delete");
}
public void update() {
System.out.println("update");
}
public void select() {
System.out.println("select");
}
}
重点来了,这时候要扩展一个新的功能,不能改变原来的业务代码,就得用代理
public class UserServicePrexy implements UserService{
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void add() {
log4j("add");
userService.add();
}
public void delete() {
userService.delete();
}
public void update() {
userService.update();
}
public void select() {
userService.select();
}
public void log4j(String mes ){
System.out.println("使用了"+mes+"方法");
}
}
添加了一个log4j日志功能,原来的UserServiceImpl没有改动代码
实例
public class Client {
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
UserServicePrexy userServicePrexy=new UserServicePrexy();
userServicePrexy.setUserService(userService);
userServicePrexy.add();
}
}
到这里就很清楚的明白代理模式的思路了吧。
总结一下:
- 代理模式可以使真是角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就是交给代理角色,实现了业务的分工
- 代理是一种设计的思想,提供了间接对目标对象进行访问的方式;即通过代理访问目标对象,可以在目标对象中进行实现功能,增加额外的功能,扩展性高,符合了设计模式的开闭原则,即是在对原有的代码不改动下,进行功能扩展
动态代理代码(利用反射机制)解决了代理模式的缺点
原文地址:https://www.cnblogs.com/myblogswcz/p/12687624.html
- 日志分析实战之清洗日志小实例5:实现获取不能访问url
- CentOS安装Redis、PHPredis扩展
- 日志分析实战之清洗日志小实例4:统计网站相关信息
- PHP-数组排序
- hdu---(3555)Bomb(数位dp(入门))
- PHP-循环
- 日志分析实战之清洗日志小实例3:如何在spark shell中导入自定义包
- PHP-函数
- hdu----(5045)Contest(数位dp)
- hdu----(5053)the Sum of Cube(签到题,水体)
- RHEL构建DNS服务器-多区域
- hdu----(5050)Divided Land(二进制求最大公约数)
- 日志分析实战之清洗日志小实例1:使用spark&Scala分析Apache日志
- RHEL构建DNS服务器-单区域
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php微信公众号开发之图片回复
- php微信公众号开发之答题连闯三关
- swoole_process实现进程池的方法示例
- golang实现php里的serialize()和unserialize()序列和反序列方法详解
- keras 实现轻量级网络ShuffleNet教程
- Python应用实现处理excel数据过程解析
- Python实现爬取并分析电商评论
- python中怎么表示空值
- Keras自动下载的数据集/模型存放位置介绍
- Keras 切换后端方式(Theano和TensorFlow)
- python 字符串的驻留机制及优缺点
- php微信公众号开发之翻页查询
- php 中phar包的使用教程详解
- php微信公众号开发之快递查询
- Scrapy框架介绍之Puppeteer渲染的使用