美丽涵涵童装店--说我博客名字,给你们打折!
随笔 - 82  文章 - 266  trackbacks - 0
<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456


点击这里给杨爱友发消息
美丽涵涵童装店
说我博客名字,给你们打折!

常用链接

留言簿(6)

随笔分类

随笔档案

文章档案

好友的BLOG

搜索

  •  

最新评论

阅读排行榜

评论排行榜

代理模式:为其他对象提供一种代理以控制对这个对象的访问。这种功能只有在编译无法确定要实现哪个接口时才有必要使用。利用代理可以创建一个实现了一组接口的新类。代理类与被代理类必须实现同一个接口,代理对象是在运行时由调用处理器定义的新类,它有一个名字,如$Proxy0。代理对象一旦被创建,与虚拟机上的任何其他类没有什么区别。

给大家举个比较简单的例子:
假如你买台IBM的笔记本,IBM产家是不提供鼠标的.但是我们如果从代理商的手里买就有鼠标和送.
很简单的例子,写几个类来实现一下吧.
1. 首先设计一个购买的接口代码如下:(ComputerInterface.java)
1 public interface ComputerInterface {
2      public void buy();
3 }
4 

2. 建一个电脑类实现购买的接口代码如下:(Computer.java)  
 1 public class Computer implements ComputerInterface{
 2     private String pcName="IBMT60";
 3     private int pcPrice=17800;
 4     public String getPcName() {
 5         return pcName;
 6     }
 7     public void setPcName(String pcName) {
 8         this.pcName = pcName;
 9     }
10     public int getPcPrice() {
11         return pcPrice;
12     }
13     public void setPcPrice(int pcPrice) {
14         this.pcPrice = pcPrice;
15     }
16     public void buy() {
17     System.out.print("获得笔记本电脑:"+pcName+"一台");
18     }
19 }

3. 再建设一个代理商的类:用来完成买电脑和赠送鼠标:(ComputerProxy.java)
 1 public class ComputerProxy {
 2     private ComputerInterface pci;
 3     public ComputerInterface getPci() {
 4         return pci;
 5     }
 6     public void setPci(ComputerInterface pci) {
 7         this.pci = pci;
 8     }
 9     public void buy(){
10         pci.buy();
11         System.out.println("赠送鼠标一个");
12     }
13 }

4. 建一个主函数测试一下:(TestDemo.java)
1 public class TestDemo {
2     public static void main(String[] args) {
3         ComputerProxy c1=new ComputerProxy();
4         c1.setPci(new Computer());
5         c1.buy();
6     }
7 }

运行结果如下:
获得笔记本电脑:IBMT60一台获得鼠标一个
以上就是代理功能的实现,由代理商销售笔记本,并赠送鼠标.但是这样的程序只适合是销售IBM笔记本.那么如果要是其它品牌呢.所以我们来更改一个代理类.来实现动态的代理.

5. 建立一个类代码如下:(ComputerDynamicProxy.java)
 1 public class ComputerDynamicProxy implements InvocationHandler {
 2     /*
 3      * 调用处理器是实现了InvocationHandler接口的类对象,在这个接口中只有一个方法:
 4      * Object invoke(Object proxy,Method method,Object[] args);
 5      * 无论何时调用代理对象的方法,调用处理器的invoke()方法都会被调用,并向其传递Method对象和原始的参数。
 6      */ 
 7     private Object delegate;
 8     
 9     // 描述是谁的代理,也就是与那个类有关系
10     public Object bind(Object delegate) {
11         this.delegate = delegate;
12         return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
13                 delegate.getClass().getInterfaces(), this);
14     }
15 
16     public Object invoke(Object proxy, Method method, Object[] args)
17             throws Throwable {
18         System.out.println("赠送鼠标一个!");
19         Object result = method.invoke(delegate, args);
20         return result;
21     }
22 }

主函数修改如下:
      
1 public class TestDemo {
2     public static void main(String[] args) {
3         ComputerDynamicProxy proxy = new ComputerDynamicProxy();
4         ComputerInterface computer = (ComputerInterface) proxy.bind(new Computer());
5         //返回一个代理类的实例,并非返回一个ComputerInterface对象,事实上他也不能被实例化不能有对象,返回的对象名可能为$computer
6         computer.buy();
7     }
8 }
9 

就可以实现动态代理了.
posted on 2007-09-04 01:15 杨爱友 阅读(778) 评论(0)  编辑  收藏 所属分类: java相关技术

只有注册用户登录后才能发表评论。


网站导航:
 
美丽涵涵童装店
亲,说我博客名字,给你们打折!