设计模式 - 代理模式(jdk)
定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
一、静态代理
静态代理说白了就是把原先直接调用被代理类的方法放到代理类来调用,同时
我们可以在代理类额外的添加一些操作。
接口:
package com.proxy.example; public interface Employ { void work(); }
实现:
package com.proxy.example; public class Engineer implements Employ { @Override
public void work() {
System.out.println("写代码。。。"); } }
代理:
package com.proxy.example; public class StaticProxy implements Employ { private Employ employ; public StaticProxy(Employ employ) {
super();
this.employ = employ;
} @Override
public void work() {
punchCard();
employ.work();
getfforkunch();
} private void punchCard(){
System.out.println("上班打卡。。。");
} private void getfforkunch(){
System.out.println("下班打卡。。。");
} }
测试:
package com.proxy.example; public class TestStaticProxy { public static void main(String[] args) {
StaticProxy proxy = new StaticProxy(new Engineer());
proxy.work(); } }
二、jdk动态代理
从前面的静态代理可以看出,我们可以使用代理添加一些额外的操作,但是如果我有
许多不同的接口的实现类要代理,那么就要写很多不同的静态代理类,因此动态代理就孕育而生了。
在添加一个被代理的类:
接口:
package com.proxy.example.dynamic; public interface Manager { void analysis(); }
实现:
package com.proxy.example.dynamic; public class DemandManager implements Manager { @Override
public void analysis() {
System.out.println("分析需求。。。");
} }
创建代理的类:
package com.proxy.example.dynamic; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) {
this.target = target;
} /**
* proxy: 指代我们所代理的那个对象
* method: 指代的是我们所要调用真实对象的某个方法的Method对象
* args: 指代的是调用真实对象某个方法时接受的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
punchCard();
Object result = method.invoke(target, args);
getfforkunch();
return result;
} private void punchCard(){
System.out.println("上班打卡。。。");
} private void getfforkunch(){
System.out.println("下班打卡。。。");
} /**
* 通过Proxy类的newProxyInstance方法来创建我们的代理类对象,三个参数含义:
* 第一个参数target.getClass().getClassLoader() ,我们这里使用被代理对象target这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数target.getClass().getInterfaces(),我们这里为代理对象提供的接口是被代理对象所实现的接口,这样我们生成的代理对象的方法就有我们被代理的对象的方法了
* 第三个参数this, 指当前的代理对象
*/
public Object getProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} }
测试:
package com.proxy.example.dynamic; import com.proxy.example.Employ;
import com.proxy.example.Engineer; public class TestDynamicProxy { public static void main(String[] args) {
Engineer engineer = new Engineer();
DynamicProxy engineerProxy = new DynamicProxy(engineer);
Employ employEngineer = (Employ)engineerProxy.getProxy();
employEngineer.work(); Manager manager = new DemandManager();
DynamicProxy managerProxy = new DynamicProxy(manager);
Manager demandManager = (Manager)managerProxy.getProxy();
demandManager.analysis(); } }
如果按照静态代理就要再写一个代理类,但是动态代理就可以和它的名字一样进行动态的生成代理类。
设计模式 - 代理模式(jdk)的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- 代理模式-JDK Proxy(Java实现)
代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. Array ...
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- 设计模式——代理模式(静态代理和JDK、CGLib动态代理)
简介 什么是代理模式? 代理模式就是多一个代理类出来,代替原对象进行一些操作.比如说租房的中介.打官司的律师.旅行社,他们可以代替我们做一些事情,这就是代理. 代理模式的应用场景: 如果已有的方法在使 ...
- linkin大话设计模式--代理模式
代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端并不关心是否可以准确的得到这个对象,他只要一个能够提供该功能的对象而已,此时我们就可以返回该对象的代理.总而言之,客户端 ...
- Java设计模式の代理模式
目录 代理模式 1.1.静态代理 1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...
随机推荐
- RFM模型——构建数据库营销的商业战役!(转)
RFM模型:R(Recency)表示客户最近一次购买的时间有多远,F(Frequency)表示客户在最近一段时间内购买的次数,M (Monetary)表示客户在最近一段时间内购买的金额.一般原始数据为 ...
- 查看c语言的函数运行时间的简单模板
/* clock():捕捉从程序开始运行到 clock() 被调用时所耗费的时间,时间单位 是clock tick, 即:"时钟打点". 常数CLK_TCK:机器时钟每秒所走的时钟 ...
- 【JAVAWEB学习笔记】网上商城实战3:购物模块和订单模块
网上商城实战3 今日任务 完成购物模块的功能 完成订单模块的功能 1.1 购物模块: 1.1.1 功能演示: 商品详情: 购物车模块: 1.1.2 代码实现: 1.在商品详情的页 ...
- 前端单元测试框架-Mocha
引言 随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是'急剧上升',所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React.Vue,因为有自己的语法规则,及时每个开发人员的 ...
- mysql之 MySQL 主从基于 GTID 复制原理概述
一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...
- HTML5录音控件
最近的项目又需要用到录音,年前有过调研,再次翻出来使用,这里做一个记录. HTML5提供了录音支持,因此可以方便使用HTML5来录音,来实现录音.语音识别等功能,语音开发必备.但是ES标准提供的API ...
- bettercap实现内网Dns欺骗
目的 让内网的所有计算机浏览网页的时候, 出现我的钓鱼页面 准备 kali系统 Bettercap dns文件 通过ifconfig查看当前计算机的ip, 我这边为, 192.168.1.150 创建 ...
- 浏览器未安装flash插件,js判断直接去官网安装
近期做了个活动页,里面根据需求插入了阿里云的视频,常见的浏览器都支持包括低版本的. 由于浏览器的更新换代很多版本放弃了flash的插件安装,火狐就是其中之一. 未安装flash的浏览器如果打开这个链接 ...
- [原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件
本人因为要想自己写个小说网站练练手,在其中遇到的一些问题,将其解决方法总结出来,例如: 1:小说网站存储了大量的小说,每个小说主页都很相似,url不同,不是使用的history属性改写的,所以如果人工 ...
- 【PHP】最详细PHP从入门到精通(三)——PHP中的数组常用函数汇总
PHP从入门到精通 之PHP中的数组常用函数详解 数组作为PHP中最常用的结构之一,PHP强大的数组函数功能,给数组的相关操作带来了极大的便利.今天给大家介绍的PHP中数组函数,是PHP数组中重要的 ...