java2核心技术之代理模式

java2核心技术之代理模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。这种功能只有在编译无法确定要实现哪个接口时才有必要使用。利用代理可以创建一个实现了一组接口的新类。代理类与被代理类必须实现同一个接口,代理对象是在运行时由调用处理器定义的新类,它有一个名字,如$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 

就可以实现动态代理了.

你可能感兴趣的:(java2核心技术之代理模式)