代理模式:
1.事情必须做,但是没有时间做或者自己不想做
2.持有被代理对象的引用
代理模式分为静态代理和动态代理,
接下来演示动态代理的媒婆为室友找对象案例的具体实现
创建服务类接口:
public interface Person {
void findLove();
}
继承接口的实现类:
public class RoomMate implements Person{
private String name="ZY";
private String sex = "男";
@Override
public void findLove() {
System.out.println("我叫"+this.name+",性别:"+this.sex+"我找对象的要求是:");
System.out.println("像我桌面这样的");
}
}
代理类继承 InvocationHandler接口
package proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Meipo implements InvocationHandler {
private Person target;
public Object getInstance(Object target) throws Exception{
this.target = (Person) target;
Class<?> clazz = target.getClass();
System.out.println("被代理对象的class是:"+clazz);
return Proxy.newProxyInstance(target.getClass().getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是媒婆,正在帮你找对象...");
System.out.println("------------");
this.target.findLove();
System.out.println("------------");
System.out.println("找不到符合您要求的对象");
return null;
}
}
测试类:
public class TestFindLove {
public static void main(String[] args) {
try {
Person o = (Person) new Meipo().getInstance(new RoomMate());
System.out.println(o.getClass());
o.findLove();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
被代理对象的class是:class proxy.jdk.RoomMate
class com.sun.proxy.$Proxy0
我是媒婆,正在帮你找对象...
------------
我叫ZY,性别:男我找对象的要求是:
像我桌面这样的
------------
找不到符合您要求的对象