代理设计模式:为其他对象提供一种代理,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下,添加一些额外的功能。还隐藏被代理类的细节。
静态代理
UML类图:
被代理的类
/**
* 目标类,潘**
*/
public class PJL implements Methods {
/**
* 被代理的方法
*/
@Override
public void he() {
System.out.println("羞羞羞");
}
public void eat(){
System.out.println("吃饭饭");
}
}
代理接口:
/**
* 代理接口
*/
public interface Methods {
/**
* 羞羞的方法
*/
public void he();
}
代理类:
/**
* 代理者,王*
*/
public class WP implements Methods {
private Methods methods ;
@Override
public void he() {
methods = new PJL();
System.out.println("给点小费呗");
methods.he();
}
}
测试类:
/**
* 测试类,西门*
*/
public class XMQ {
public static void main(String[] args) {
WP wp = new WP();
wp.he();
}
}
动态代理
动态代理类在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和被代理类的关系是在程序运行时确定。
被代理的类:
package moving;
/**
* 目标类
* @author asus
*/
public class lucida implements lucidaMethod{
@Override
public String show(String name) {
System.out.println("跳了一支《"+name+"》舞");
return "跳完了";
}
@Override
public String sing(String name) {
System.out.println("唱了一首《"+name+"》");
return "唱完啦";
}
/**
*此方法不需要被代理,不需要抽成接口
*/
public void eat(){
System.out.println("吃饭");
}
}
代理接口中需要被代理的方法的接口:
package moving;
/**
* 需要被代理的方法
* @author asus
*
*/
public interface lucidaMethod {
/**
* 跳舞
* @param name 舞蹈名字
* @return 是否表演
*/
public String show(String name);
/**
* 唱歌
* @param name 歌曲名字
* @return 是否唱歌
*/
public String sing(String name);
}
代理类:
package moving;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理类
* @author asus
*
*/
public class ProxyClass {
/**创建被代理的对象,*/
private static final lucida lu = new lucida();
/**
* 访问代理类的方法
* @return 被代理的方法
*/
public static lucidaMethod getPoxyInstance(){
//使用proxy中的方法获取代理类对象
lucidaMethod obj = (lucidaMethod)Proxy.newProxyInstance(
//第一个参数,定义代理类的类加载器
ProxyClass.class.getClassLoader(),
//第二个参数,代理类要实现的接口列表
lu.getClass().getInterfaces(),
/*
*第三个参数
* 拦截外界调用代理对象中的任何方法,
* 当外界调用代理对象的的方法后,InvocationHandler类中的invoke方法自动执行
*/
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//对show方法进行增强
if("show".equals(method.getName())){
System.out.println("先给钱,跳舞");
return method.invoke(lu, args);
//对sing方法进行增强
}else if("sing".equals(method.getName())){
System.out.println("先给钱,然后才可以唱歌");
return method.invoke(lu, args);
}else{
System.out.println("暂时没有代理此业务");
}
return null;
}
});
return obj;
}
}
结语:未完待续吧,等领悟的更加透彻后,再做修改。