java代理模式

  代理模式分为静态代理与动态代理

1、静态代理

  静态模式代理步骤

  1)、定义一个接口

    

package com.mr.cheng.proxy;
/**
* 动物属性接口
* @author zwc
*
*/
public interface Animal {
public void canSpeak();
public void canRun();
}

  

 

  2)、定义该接口的实现类

package com.mr.cheng.proxy;
/**
 * 接口实现类
 * @author zwc
 *
 */
public class Monkey implements Animal {

	@Override
	public void canSpeak() {
		System.out.println("动物可以交,喊!");
	}

	@Override
	public void canRun() {
		System.out.println("动物可以跑!");
	}

}

  

  3)、定义一个静态代理类

  

package com.mr.cheng.proxy;
/**
 * 代理类
 * @author zwc
 *
 */
public class AnimalProxy implements Animal {
	private Animal animal;
	public AnimalProxy(Animal animal){
		this.animal = animal;
	}
	@Override
	public void canSpeak() {
		animal.canSpeak();
	}


	@Override
	public void canRun() {
		animal.canRun();
	}

}

  

  4)、测试该静态代理

package com.mr.cheng.proxy;

public class AnimalTest {

	public static void main(String[] args) {
		Animal animal = new Monkey();
		AnimalProxy animalProxy = new AnimalProxy(animal);
		animalProxy.canRun();
		animalProxy.canSpeak();
	}

}

总以上代码可以看得出,接口如果新增一个实现类,必须新增一个代理。这样代码重复性就非常的高。动态代理就可以避免这种现象。

  

2、动态代理

  代理模式分为jdk代理与cglib代理

jdk代理,代理类必须实现InvocationHandler类中的invoke方法,

  1)、定义一个接口

    

package com.mr.cheng.proxy;

public interface BookInter {
	public void canRead();
}

  

  2)、定义一个接口实现类

package com.mr.cheng.proxy;

public class BookInterImpl implements BookInter {

	@Override
	public void canRead() {
		System.out.println("书是用来阅读的!");
	}

}

  

  3)、定义jdk代理

package com.mr.cheng.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * jdk代理 必须实现InvocationHandler类
 * @author zwc
 *
 */
public class BookProxy implements InvocationHandler{
	private Object object;
	/**
	 * 绑定委托对象并返回一个代理类。
	 * @param target
	 * @return
	 */
	 public Object bind(Object target) {  
        this.object = target;  
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
                target.getClass().getInterfaces(), this);   
    }
	 /**
	  * 重新invoke调用方法
	  */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		 Object result=null;  
		System.out.println("方法开始调用");
		result = method.invoke(object, args);
		System.out.println("方法结束调用");
		return result;
	}  


}

  4)、测试

package com.mr.cheng.proxy;

public class BookTest {
	public static void main(String[] args) {
		BookProxy BookProxy = new BookProxy();
		BookInter bookInter = (BookInter) BookProxy.bind(new BookInterImpl());
		bookInter.canRead();
	}
}


  

参考:http://kuangbaoxu.iteye.com/blog/192804  http://www.open-open.com/home/space-24-do-blog-id-12.html
posted @ 2015-03-25 14:06  通往酱油的路上  阅读(114)  评论(0编辑  收藏  举报