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
浙公网安备 33010602011771号