- 浏览: 543477 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
一、概念和注意点:
Once you write a dynamic proxy class, you can use it to wrap any object, so
long as the object is an instance of a class that implements an interface that
declares the behavior you want to intercept.
动态代理可以用来包裹任何类,拦截这个类实现的接口中的某些方法,在执行这些方法
的前后加入适当动作。
Dynamic proxies in Java let you wrap an object with a proxy that intercepts
the object's calls and that can add behavior before or after passing the call
along.This lets you create reusable behavior that you can drop in on an arbitrary
object, in a fashion similar to aspect-oriented programming.
在被拦截的方法前后加入适当操作——提高了“可重用性”,类似AOP的做法。
In AOP, an aspect is a combination of aspect——code that you want to drop in
——and point cuts——definitions of execution points in your code where you want
the drop-in code to run.
理解AOP中的两个概念:
1)aspect——可重用代码
2)point cuts——执行点
Sam的总结: Dynamic Proxies就是一个拦截器,在某些操作的前后加上可重用代码。记住
Java中实现动态代理需要实现的接口和方法。
二、代码
动态代理的使用ShowDynamicProxy.java
原来的对象HashSet s 被代理后,可以转化为HashSet的(任意)父接口Set,在执行Set中声明的任意方法时,会在外围包裹拦截动作^_^
package app.proxy.dynamic; import java.util.HashSet; import java.util.Set; import com.oozinoz.firework.Firecracker; import com.oozinoz.firework.Sparkler; import com.oozinoz.utility.Dollars; /** * Show an example of using a dynamic proxy to add behavior to an object. In * this example, we add an element of impatience, complaining if any method * takes too long to execute. */ public class ShowDynamicProxy { public static void main(String[] args) { Set s = new HashSet(); s = (Set) ImpatientProxy.newInstance(s); /* 代理后可以强制转化为原来类实现的任何接口类型 */ s.add(new Sparkler("Mr. Twinkle", new Dollars(0.05))); s.add(new BadApple("Lemon")); s.add(new Firecracker("Mr. Boomy", new Dollars(0.25))); System.out.println("The set contains " + s.size() + " things."); } }
动态代理类ImpatientProxy.java
1)动态代理类必须实现InvocationHandler接口,以及该接口中的invoke(...)方法;
2)背下来:静态实例化方法newInstance(...)的实现。
package app.proxy.dynamic; import java.lang.reflect.*; /** * This class is an example of a dynamic proxy. Instances of this class wrap a * proxied object. This class simply forwards calls to the object it wraps. * However, if any method takes a long time to execute, this class will print a * warning message. */ public class ImpatientProxy implements InvocationHandler { private Object obj; /** * Construct a dynamic proxy around the given object. * @param obj the object to wrap * @return the proxy */ public static Object newInstance(Object obj) { ClassLoader loader = obj.getClass().getClassLoader(); /* 获取“被代理类”的加载器 */ Class[] classes = obj.getClass().getInterfaces(); /* 获取“被代理类”实现的接口 */ return Proxy.newProxyInstance(loader, classes, new ImpatientProxy(obj)); /* 返回Object类型的代理 */ /* * 注意:The returned object will implement all the interfaces that the wrapped * object's class implements. We can cast the returned object to any of these * interfaces. */ } private ImpatientProxy(Object obj) { this.obj = obj; } /** * The method that all dynamic proxies must implement. This dynamic proxy * complains when a method takes a long time to return. */ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object result; long t1 = System.currentTimeMillis(); result = m.invoke(obj, args); long t2 = System.currentTimeMillis(); if (t2 - t1 > 10) { System.out.println("> It takes " + (t2 - t1) + " millis to invoke " + m.getName() + "() with"); for (int i = 0; i < args.length; i++) System.out.println("> arg[" + i + "]: " + args[i]); } return result; } }
发表评论
-
(第十章)一个xml解析器和构造器
2013-03-10 16:40 927本章的前两节“10.1 状态机”、“10.2 ... -
享元模式——Flyweight
2012-02-17 13:10 1067享元模式——Flyweig ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2092一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 1006public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1322观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1504适配器模式 —— Adapto ... -
状态模式——State (更好的实现状态机)
2011-12-28 14:10 656621. 概述 The intent o ... -
装饰者模式——Decorator
2011-12-25 11:11 1181装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 10111. Composite 定义 : ... -
构造者模式——Builder
2011-08-10 13:59 1070构造者模式——Builder 本文是《Java设计模 ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 935一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1711因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 997在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 950偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1064A Classic Example: Image Prox ... -
策略模式——strategy
2011-06-02 12:36 901Strategy Pattern ...
相关推荐
代理模式在软件设计模式中是一种常用的技术,它允许我们在访问或操作某个对象时,通过一个中介对象(代理)来进行,从而增加了灵活性和控制性。在本文中,我们将探讨代理模式的最朴素实现,并通过Java代码示例进行...
在这个名为“代理模式Image Proxies”的主题中,我们将探讨如何通过最朴素的方式来实现图像加载的代理。这个话题主要涉及到两个Java类:`LoadingImageIcon.java`和`ShowLoader.java`。 `LoadingImageIcon.java`可能...
代理模式在软件设计中是一种常用的设计模式,它允许我们为一个对象提供一个替代品或占位符,以便控制对真实对象的访问。在远程方法调用(Remote Method Invocation,RMI)场景下,代理模式的应用尤为突出。RMI是Java...
标题"proxies_chi.zip"和描述中提到的内容是关于创建一个代理IP池的Python项目,这个项目能够自动从网络上抓取IP地址,检查它们的可用性,并将这些信息存储到数据库中,以便后续使用。这涉及到网络爬虫、IP验证、...
在Laravel框架中,"laravel-valid-proxies"通常指的...在实际开发中,正确配置和使用`laravel-valid-proxies`可以帮助开发者解决因代理而产生的各种问题,如防止恶意请求,以及在多层代理环境中正确识别客户端IP地址。
在.NET Framework中,C#动态代理是一种强大的设计模式,它允许我们在运行时创建对象的代理,从而可以在调用实际目标对象的方法之前或之后插入额外的行为。动态代理的主要用途包括:AOP(面向切面编程)、远程方法...
Koa代理 middlware HTTP代理 由提供支持。 安装 $ npm install koa-proxies --save 选件 http-proxy活动 options . events = { error ( err , req , res ) { } , proxyReq ( proxyReq , req , res ) { } , ...
学习网络爬虫难免遇到使用代理的情况,下面介绍一下如何使用requests设置代理: 如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requests proxies = { ...
在Java的远程方法调用(Remote Method Invocation, RMI)技术中,智能代理(Smart Proxies)和拦截器(Interceptors)是两个重要的概念,它们为分布式系统提供了增强的功能和控制。本文将深入探讨这两个概念及其在...
- 打开文件:`with open('proxies.txt', 'w') as f`,'w'表示写入模式。 - 写入数据:`f.write(ip + '\n')`,每行写入一个IP。 综上所述,这个项目涵盖了Python的网络请求、HTML解析、代理设置、多线程和数据存储...
Cglib是Eclipse的Dynamic Proxies的一个补充,它在某些情况下提供了更高的性能。 Cglib的核心是基于ASM库,ASM是一个字节码操作和分析框架,可以直接生成和修改Java类和属性。ASM-commons和ASM-tree分别是ASM的辅助...
在Java Web开发中,JSP(JavaServer Pages)和Struts是两个常用的技术,用于构建动态、交互式的Web应用程序。Struts作为一个MVC(Model-View-Controller)框架,为开发者提供了一种组织和管理应用逻辑的方式,而JSP...
在本文中,我们将深入探讨Laravel框架中的代理验证(laravel-valid-proxies)这一主题。Laravel是一个流行的PHP框架,它提供了丰富的功能和工具,帮助开发者构建高效、优雅的Web应用。`laravel-valid-proxies`是...
资源分类:Python库 所属语言:Python 资源全名:proxies_l-0.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在Java编程领域,网络通信和代理(Proxies)是重要的组成部分,特别是在开发需要跨网络进行数据交换的应用时。本文将详细解析"Java Networking and Proxies Code"这一主题,包括如何启动一个线程来检查URL是否通过...
刮擦旋转代理 该软件包提供了一个中间件来使用旋转代理,检查它们是否还活着并调整爬网速度。 许可证是麻省理工学院。安装pip install scrapy-rotating-proxies用法将带有代理列表的ROTATING_PROXY_LIST选项添加到...
Scrapy-Scylla-Proxies 是一个 Python 库,专门用于Scrapy爬虫框架,它提供了高效且稳定的代理服务器管理功能。这个库的版本是0.1.4.1,可以在Python的包索引(PyPI)官网上找到并下载。在Python的开发中,PyPI是一...
为实现这一功能,开发者常常利用设计模式来辅助,其中一种常用的方法是使用"代理"(Proxies)。本文将详细探讨如何通过JavaScript的Proxy对象来实现对象撤消/重做以及记录更改历史。 首先,让我们理解什么是Proxy。...
标题中的"Delphi_Proxy_Scraper.zip_Proxies"暗示了这是一个使用Delphi编程语言编写的代理服务器抓取程序。Delphi是一种基于Object Pascal的集成开发环境(IDE),常用于创建桌面应用程序。在这个项目中,开发者可能...