- 浏览: 386587 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (285)
- test (0)
- 分类 (1)
- java (281)
- tttttttttttt (1)
- android程序复制数据库 (1)
- Hibernate 动态 HQL (1)
- java编写扑克的洗牌程序 (1)
- NIO 之 选择就绪模式 (1)
- wpo另类问题:不可轻视的蜘蛛爬行对服务器造成的负担 (1)
- haml (1)
- cvcvcvc (1)
- 开源史上最成功的8个开源产品 (1)
- XML文件转换成Word文件或者Excel文件 (1)
- 一些利用开源浏览器核心开发专用浏览器的连接 (1)
- 毛笔效果简单思路 (1)
- 年终考评以后 (1)
- RFC821 简单邮件传输协议(SMTP)中文定义文档 (1)
- JNI中jstring类型与c语言中的字符串的转换 (1)
- 极限编程(XP)的重构与设计模式 (1)
- MapInfo2005年第三期电子新闻 (1)
- 想到目前各BLOG站点和搜索引擎的一点点缺陷 (1)
- 成功通过DB2的700和701考试 (1)
- 基于记录登陆信息的防止网页暴力破解方法 (1)
- Router路由 (1)
- 终于稍微完整的学习了一下Linux (1)
- android手机通讯录备份还原代码 (1)
- Qt之美(一):d指针/p指针详解 (1)
- DB2 静默安装 (1)
- linux开机启动脚本的顺序 (1)
- Hibernate实体对象的三种状态 (1)
- Hibernate面向对象的hql语句 (1)
- ibatIS调用存储过程 (1)
- Linux启动过程(详细说明) (1)
- C3P0配置 (1)
- memcache安装 (1)
- js event.keyCode (1)
- java获取汉子首字母 (1)
- Eclipse GC log (1)
- java轻量级httpserver (1)
最新评论
-
smilea001:
我知道了,作者采用的是gbk编码,我采用的是utf-8编码,
java获取汉子首字母 -
smilea001:
我输入的也是--
java获取汉子首字母 -
di1984HIT:
写的不错啊。
Router路由 -
kaixinyou:
...
2011.07.20——— android 获得当前view在屏幕的坐标 -
zhengjianbo:
你好,可以将你的实现代码公布下吗!万分感谢!
毛笔效果简单思路
1. 代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
以下以《java与模式》中的示例为例:
抽象角色:
abstract public class subject {
abstract public void request();
}
真实角色:实现了subject的request()方法。
public class realsubject extends subject {
public realsubject() { }
public void request() {
system.out.println( " from real subject. " );
}
}
代理角色:
public class proxysubject extends subject {
private realsubject realsubject; // 以真实角色作为代理角色的属性
public proxysubject() { }
public void request() { // 该方法封装了真实对象的request方法
prerequest();
if ( realsubject == null ) {
realsubject = new realsubject();
}
realsubject.request(); // 此处执行真实对象的request方法
postrequest();
}
客户端调用:
subject sub = new proxysubject();
sub.request();
由以上代码可以看出,客户实际需要调用的是realsubject类的request()方法,现在用proxysubject来代理 realsubject类,同样达到目的,同时还封装了其他方法(prerequest(),postrequest()),可以处理一些其他问题。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过java的动态代理类来解决。
2.动态代理类
java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
(1). interface invocationhandler:该接口中仅定义了一个方法object:invoke(object obj,method method, object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。
(2).proxy:该类即为动态代理类,作用类似于上例中的proxysubject,其中主要包含以下内容:
protected proxy(invocationhandler h):构造函数,估计用于给内部的h赋值。
static class getproxyclass (classloader loader, class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
static object newproxyinstance(classloader loader, class[] interfaces, invocationhandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在subject接口中声明过的方法)。
所谓dynamic proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个dynamic proxy其实就是一个proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现invocationhandler接口,以第一节中的示例为例:
抽象角色(之前是抽象类,此处应改为接口):
public interface subject {
abstract public void request();
}
具体角色realsubject:
public class realsubject implements subject {
public realsubject() {}
public void request() {
system.out.println( " from real subject. " );
}
}
代理处理器:
import java.lang.reflect.method;
import java.lang.reflect.invocationhandler;
public class dynamicsubject implements invocationhandler {
private object sub;
public dynamicsubject() {}
public dynamicsubject(object obj) {
sub = obj;
}
public object invoke(object proxy, method method, object[] args) throws throwable {
system.out.println( " before calling " + method);
method.invoke(sub,args);
system.out.println( " after calling " + method);
return null ;
}
}
该代理类的内部属性为object类,实际使用时通过该类的构造函数dynamicsubject(object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。
客户端:
import java.lang.reflect.invocationhandler;
import java.lang.reflect.proxy;
import java.lang.reflect.constructor;
import java.lang.reflect.method;
public class client {
static public void main(string[] args) throws throwable {
realsubject rs = new realsubject(); // 在这里指定被代理类
invocationhandler ds = new dynamicsubject(rs);
class cls = rs.getclass();
// 以下是一次性生成代理
subject subject = (subject) proxy.newproxyinstance(cls.getclassloader(), cls.getinterfaces(),ds );
subject.request();
}
程序运行结果:
before calling public abstract void subject.request()
from real subject.
after calling public abstract void subject.request()
通过这种方式,被代理的对象(realsubject)可以在运行时动态改变,需要控制的接口(subject接口)可以在运行时改变,控制的方式(dynamicsubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
以下以《java与模式》中的示例为例:
抽象角色:
abstract public class subject {
abstract public void request();
}
真实角色:实现了subject的request()方法。
public class realsubject extends subject {
public realsubject() { }
public void request() {
system.out.println( " from real subject. " );
}
}
代理角色:
public class proxysubject extends subject {
private realsubject realsubject; // 以真实角色作为代理角色的属性
public proxysubject() { }
public void request() { // 该方法封装了真实对象的request方法
prerequest();
if ( realsubject == null ) {
realsubject = new realsubject();
}
realsubject.request(); // 此处执行真实对象的request方法
postrequest();
}
客户端调用:
subject sub = new proxysubject();
sub.request();
由以上代码可以看出,客户实际需要调用的是realsubject类的request()方法,现在用proxysubject来代理 realsubject类,同样达到目的,同时还封装了其他方法(prerequest(),postrequest()),可以处理一些其他问题。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过java的动态代理类来解决。
2.动态代理类
java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
(1). interface invocationhandler:该接口中仅定义了一个方法object:invoke(object obj,method method, object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。
(2).proxy:该类即为动态代理类,作用类似于上例中的proxysubject,其中主要包含以下内容:
protected proxy(invocationhandler h):构造函数,估计用于给内部的h赋值。
static class getproxyclass (classloader loader, class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
static object newproxyinstance(classloader loader, class[] interfaces, invocationhandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在subject接口中声明过的方法)。
所谓dynamic proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个dynamic proxy其实就是一个proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现invocationhandler接口,以第一节中的示例为例:
抽象角色(之前是抽象类,此处应改为接口):
public interface subject {
abstract public void request();
}
具体角色realsubject:
public class realsubject implements subject {
public realsubject() {}
public void request() {
system.out.println( " from real subject. " );
}
}
代理处理器:
import java.lang.reflect.method;
import java.lang.reflect.invocationhandler;
public class dynamicsubject implements invocationhandler {
private object sub;
public dynamicsubject() {}
public dynamicsubject(object obj) {
sub = obj;
}
public object invoke(object proxy, method method, object[] args) throws throwable {
system.out.println( " before calling " + method);
method.invoke(sub,args);
system.out.println( " after calling " + method);
return null ;
}
}
该代理类的内部属性为object类,实际使用时通过该类的构造函数dynamicsubject(object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。
客户端:
import java.lang.reflect.invocationhandler;
import java.lang.reflect.proxy;
import java.lang.reflect.constructor;
import java.lang.reflect.method;
public class client {
static public void main(string[] args) throws throwable {
realsubject rs = new realsubject(); // 在这里指定被代理类
invocationhandler ds = new dynamicsubject(rs);
class cls = rs.getclass();
// 以下是一次性生成代理
subject subject = (subject) proxy.newproxyinstance(cls.getclassloader(), cls.getinterfaces(),ds );
subject.request();
}
程序运行结果:
before calling public abstract void subject.request()
from real subject.
after calling public abstract void subject.request()
通过这种方式,被代理的对象(realsubject)可以在运行时动态改变,需要控制的接口(subject接口)可以在运行时改变,控制的方式(dynamicsubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。
发表评论
-
java轻量级httpserver
2012-02-08 11:48 1561httpclient+httpserver demo ... -
Eclipse GC log
2012-02-04 16:59 1391为了查看Eclipse GC log,需要在eclip ... -
java获取汉子首字母
2012-02-03 09:14 1512public class StringUtil { ... -
js event.keyCode
2012-02-03 09:09 1195<span style="" ... -
memcache安装
2012-02-02 12:04 1137? <blockquote> 1. ... -
C3P0配置
2012-02-02 11:34 971cquireIncrement[3] ... -
Linux启动过程(详细说明)
2012-02-01 09:09 1553<div class="post ... -
ibatIS调用存储过程
2012-01-31 15:38 1598<p>一、ibatIS调用存储过程(调用存 ... -
Hibernate面向对象的hql语句
2012-01-11 13:14 992Hibernate中hql条件语句的书写方式有: ? ... -
Hibernate实体对象的三种状态
2012-01-11 12:59 1266<p style="text- ... -
linux开机启动脚本的顺序
2011-12-21 15:14 1095下开机自动启动脚本所涉及的知识和方法、如下: ... -
DB2 静默安装
2011-12-21 11:59 1047<span style="color: ... -
Qt之美(一):d指针/p指针详解
2011-12-20 15:14 1940[/b]2011.11.16 [size=18px;] ... -
android手机通讯录备份还原代码
2011-12-20 11:54 2927<span style="font-f ... -
终于稍微完整的学习了一下Linux
2011-12-19 12:14 1161Linux以前也装过两次,不过几乎没去用。头几天看一些 ... -
Router路由
2011-12-19 10:54 1148Router路由:设定线的轨迹,在Connection ... -
基于记录登陆信息的防止网页暴力破解方法
2011-12-17 10:49 1426对黑客方面比较感兴趣的或者是比较熟悉的,应该知道溯雪这 ... -
成功通过DB2的700和701考试
2011-12-16 17:27 854嘿嘿,原以为比较没有信心的701考试也被俺成功的攻克了 ... -
想到目前各BLOG站点和搜索引擎的一点点缺陷
2011-12-15 15:54 866感觉无聊,就到中国博客网的首页逛了逛,想看看有没有什么 ... -
MapInfo2005年第三期电子新闻
2011-12-15 10:49 889<span lang="EN-US&q ...
相关推荐
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
JAVA设计模式之代理模式实例
代理模式.ppt代理模式.ppt代理模式.ppt
本程序是一个代理模式的小例子。程序比较简单。
代理模式
设计模式-代理模式(讲解及其实现代码)
深信服网闸代理模式配置教程
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式
代理模式代理模式代理模式
自己总结的代理模式和Java中的动态代理模式,有源码
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的主要作用是,用来控制真实对象的访问权限,也就是完全对外隐藏真实对象。以及在调用真实对象时,代理还可以额外的处理另外的事。 比如下面...
代理模式的小demo
自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
该资源提供了三种代理模式的使用代码,其中包含每种模式的jar包、具体代码、Demo测试类,详细的注释帮助你来理解。
设计模式C++学习之代理模式(Proxy)
.net实现设计模式之代理模式