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