本站首页    管理页面    写新日志    退出

«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

  如果你忍了,欺负你的人将来可能就进监狱了。如果你反击,欺负你的人将来可能就获选十大杰出青年了。

        QQ: 3159671

http://greenboy.javaeye.com/

http://blog.sina.com.cn/u/1278341164 小鸟吹烟


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:小鸟吹烟
日志总数:157
评论数量:424
留言数量:-1
访问次数:1253102
建立时间:2006年10月23日




[开发模式]JAVA的代理模式
文章收藏,  网上资源

tone 发表于 2007/3/14 16:28:12

代理模式:为其他对象提供一种代理以控制对这个对象的访问.说白了就是,在一些情况下客户不想或不能直接引一个对象,而代理对象可以在客户和目标对象之间起到中介作用.去掉客户不能看到的内容和服务或都增添客户需要的额外服务. 给大家举个比较简单的例子: 假如你买台IBM的笔记本,IBM产家是不提供鼠标的.但是我们如果从代理商的手里买就有鼠标和送. 很简单的例子,写几个类来实现一下吧. 首先设计一个购买的接口代码如下:(ComputerInterface.java) package test.lyx; publicinterface ComputerInterface { publicvoid buy(); } 建一个电脑类实现购买的接口代码如下:(Computer.java) package test.lyx; publicclass Computer implements ComputerInterface{ private String pcName="IBMT60"; privateintpcPrice=17800; public String getPcName() { returnpcName; } publicvoid setPcName(String pcName) { this.pcName = pcName; } publicint getPcPrice() { returnpcPrice; } publicvoid setPcPrice(int pcPrice) { this.pcPrice = pcPrice; } publicvoid buy() { System.out.print("获得笔记本电脑:"+pcName+"一台"); } } 再建设一个代理商的类:用来完成买电脑和赠送鼠标:(ComputerProxy.java) package test.lyx; publicclass ComputerProxy { private ComputerInterface pci; public ComputerInterface getPci() { returnpci; } publicvoid setPci(ComputerInterface pci) { this.pci = pci; } publicvoid buy(){ pci.buy(); System.out.println("赠送鼠标一个"); } } 建一个主函数测试一下吧:(TestDemo.java) package test.lyx; publicclass TestDemo { publicstaticvoid main(String[] args) { ComputerProxy c1=new ComputerProxy(); c1.setPci(new Computer()); c1.buy(); } } 运行结果如下: 获得笔记本电脑:IBMT60一台获得鼠标一个 以上就是代理功能的实现,由代理商销售笔记本,并赠送鼠标.但是这样的程序只适合是销售IBM笔记本.那么如果要是其它品牌呢.所以我们来更改一个代理类.来实现动态的代理. 建立一个类代码如下:(ComputerProxy2.java) package test.lyx; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; publicclass ComputerProxy2 implements InvocationHandler{ private Object delegate; //描述是谁的代理,也就是与那个类有关系 public Object bind(Object delegate){ this.delegate=delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("赠送鼠标一个!"); Object result=method.invoke(delegate, args); return result; } } 然后在主函数中加上: ComputerProxy2 c2=new ComputerProxy2(); ComputerInterface ci2=(ComputerInterface)c2.bind(new Computer()); ci2.buy(); 就可以实现动态代理了.


阅读全文(4052) | 回复(1) | 编辑 | 精华
 


回复:JAVA的代理模式
文章收藏,  网上资源

tone发表评论于2007/3/14 16:50:40

动态代理和静态代理的主要区别是,静态代理已经知道自己要代理什么类型的东西了,而动态代理却不知道。 比如说,静态代理已经明确是代理买还是卖,还是修理。 但是动态代理不知道,它可以代理一切,只要是有可代理的东西。 但是在代理商自己的附加动作上,两种代理方式应该都是确定了的。 如果一个代理商要送鼠标,那他只能送鼠标,不管他是卖什么东西。 如果想送鼠标又要送键盘,那就得再找一个代理商,不管是静态的还是动态的


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144769534 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号