- 浏览: 622192 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xianzi_2008:
xianzi_2008 写道楼主请教下,我缓存了一个List& ...
Ehcache -
xianzi_2008:
楼主请教下,我缓存了一个List<Bean>对象, ...
Ehcache -
jsdsh:
收藏好.五个字
hibernate之one-to-many详细 -
Tlife:
好!!!!
hibernate------HQL总结 -
yanqingluo:
例子很恰当。
观察者模式
1. 代理模式主要有两种:静态代理和动态代理
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
java 代码
- package ttitfly.proxy;
- public interface HelloWorld {
- public void print();
- // public void say();
- }
B: 定义一个该接口的实现类
java 代码
- package ttitfly.proxy;
- public class HelloWorldImpl implements HelloWorld{
- public void print(){
- System.out.println("HelloWorld");
- }
- // public void say(){
- // System.out.println("Say Hello!");
- // }
- }
C:定义一个静态代理类
java 代码
- package ttitfly.proxy;
- public class StaticProxy implements HelloWorld{
- public HelloWorld helloWorld ;
- public StaticProxy(HelloWorld helloWorld){
- this.helloWorld = helloWorld;
- }
- public void print(){
- System.out.println("Welcome");
- //相当于回调
- helloWorld.print();
- }
- // public void say(){
- // //相当于回调
- // helloWorld.say();
- // }
- }
D: 一个测试类:
java 代码
- package ttitfly.proxy;
- public class TestStaticProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- StaticProxy staticProxy = new StaticProxy(helloWorld);
- staticProxy.print();
- // staticProxy.say();
- }
- }
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代理类:
java 代码
- package ttitfly.proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
- public class DynamicProxy implements InvocationHandler{
- private Object object;
- //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
- //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
- public Object bindRelation(Object object){
- this.object = object;
- return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
- }
- //拦截关联的这个实现类的方法被调用时将被执行
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("Welcome");
- Object result = method.invoke(object, args);
- return result;
- }
- }
测试类:
java 代码
- package ttitfly.proxy;
- public class TestDynamicProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- DynamicProxy dp = new DynamicProxy();
- //在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。
- HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
- helloWorld1.print();
- helloWorld1.say();
- //helloWorld2将不被拦截
- HelloWorld helloWorld2 = new HelloWorldImpl();
- helloWorld2.print();
- helloWorld2.say();
- }
- }
在测试类里调用实现类的print和say方法,因为代理类里代理了HelloWorld的所有方法。所以就不需要像静态代理类那样一一实现了。
发表评论
-
常用小代码段和开发经验收集
2011-04-21 14:47 981工作中用到的笔记,方便查找,不断补充。 1,截取过长的文字部分 ... -
java.lang.UnsupportedClassVersionError: Bad version number in .class file
2009-08-26 12:25 3897转载:http://www.blogjava.net/hwpo ... -
java调用dll(Eclipse+CDT+MinGW)
2009-03-06 15:25 6546第一步:配置环境 需要安装CDT和MinGW. CDT:因为 ... -
servlet2.5与el表达式
2008-11-23 15:23 2668Servlet2.4版本默认支持EL,如果在MyEclipse ... -
自定义ClassLoader遇到的问题
2008-09-16 16:47 15151.自定义的类加载器 package classloa ... -
自定义标签调用资源文件
2008-05-12 22:28 1962自定义标签处理类一般都继承TagSupport或BodyTag ... -
Failed to install Tomcat6 service(Tomcat6安装失败解决方法)
2008-05-06 16:24 11709转载 :http://www.handandaily.com/ ... -
tomcat5.5日志配置
2008-05-06 16:13 2523tomcat5.5日志配置: 从Tomcat5.5后,默认设置 ... -
java List<String>集合 传递值给js的数组
2008-04-21 18:12 5328<script> var intIndex= ... -
c3p0 com.mysql.jdbc.CommunicationsException异常
2008-02-18 17:32 6237使用c3p0,偶尔会报异常: 2008-02-18 10:52 ... -
Pattern Matcher
2008-02-18 10:30 1942package test; import java. ... -
FileUpload组件上传文件
2008-01-23 03:05 6703利用FileUpload组件上传文件,需要到apache上下载 ... -
hibernate大字段处理
2008-01-21 16:45 3206hibernate大字段处理:以mysql为例 比如传张图片, ... -
一个页面嵌套一个页面
2008-01-15 10:45 3541一个页面嵌套一个页面,比如a.jsp嵌套b.jsp那么可以用 ... -
java clone
2008-01-13 18:17 59501.java里的clone分为: A:浅复制(浅克隆): 浅复 ... -
修改Eclipse注释里的${Date}变量格式
2008-01-08 15:47 82151.eclipse3.3里${date}日期格 ... -
List移除元素
2008-01-05 16:16 24771. Iterator的remove()是移除从集合里取出来的 ... -
JDom处理xml
2008-01-05 13:51 21081.DOM的缺点主要是由于DOM是一个接口定义语言(IDL), ... -
观察者模式
2008-01-03 00:45 21371观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听 ... -
DelegatingRequestProcessor
2007-12-27 11:30 3690采用DelegatingRequestProcessor将处理 ...
相关推荐
### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...
静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...
代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...
总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...
一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进
静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的同时添加额外的功能。以下是一个简单的静态代理模式示例: 1. 定义接口: ...
根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...
与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...
本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...
总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
静态代理是通过在源代码中创建一个代理类来实现的,这个代理类与真实对象(被代理的对象)有相同的接口。代理类在调用实际对象的方法时,可以添加额外的逻辑。以下是一个简单的静态代理示例: ```java // 接口 ...