1.如果你期望使得一个对象代表另一个对象进行各种操作,可使用Proxy(代理)模式
2.方式:一般代理、动态代理、远程代理
3.举例(一般代理)
//人接口
public interface Person {
void doSomethings();
}
//具体女人类
public class Woman implements Person{
@Override
public void doSomethings() {
// TODO Auto-generated method stub
System.out.println("实际是 woman do somethings");
}
}
//男人作为女人的代理人
public class Man implements Person{
private Person person;
public Man(Person person) {
// TODO Auto-generated constructor stub
this.person = person;
}
@Override
public void doSomethings() {
// TODO Auto-generated method stub
System.out.println("表面是 man do something");
person.doSomethings();
}
}
//测试类
public class Test {
public static void main(String[] args){
Man man = new Man(new Woman());
man.doSomethings();
}
}
//结果
表面是 man do something
实际是 woman do somethings
4.举例(动态代理)
//动物接口
public interface Animal {
void run();
}
//具体dog类
public class Dog implements Animal{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("dog running");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理:做为所有对象的代理
public class DynamicProxy implements InvocationHandler{
private Object obj;
public DynamicProxy(Object obj) {
// TODO Auto-generated constructor stub
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result = null;
result = method.invoke(obj, args);
return result;
}
public static Object Factory(Object obj){
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(obj));
}
}
//测试类
public class Test {
public static void main(String[] args){
Person woman = (Person)DynamicProxy.Factory(new Woman());
woman.doSomethings();
Animal dog = (Animal)DynamicProxy.Factory(new Dog());
dog.run();
}
}
//结果
实际是 woman do somethings
dog running
5.总结:Proxy(代理)模式的意图在于为对象提供一个代理或者占位来控制对该对象的访问。在Java中,动态代理有时可以提供一种增加可复用功能的机制。如果某对象的类可实现要截获的接口,可以使用动态代理包装该对象,增加自己的处理逻辑,以增强或者替换被包装对象代码的功能。
6.参考:http://www.open-open.com/home/space-24-do-blog-id-12.html