1.IProgrammer接口
package base.tunie.designpattern.proxy;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:28:19
* @Desc:程序员
*/
public interface IProgrammer {
/**
* 返回最擅长使用的语言
* @return String对象
*/
public void useLanguage();
}
2.AS3Programmer类
package base.tunie.designpattern.proxy;
import base.tunie.tools.test.Console;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:31:51
* @Desc:AS3 程序员
*/
public class AS3Programmer implements IProgrammer {
@Override
public void useLanguage() {
Console.println("use ActionScript 3.0 language.");
}
}
静态代理实现
3.ProgrammerProxypackage base.tunie.designpattern.proxy;
import base.tunie.tools.test.Console;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:40:30
* @Desc:
*/
public class ProgrammerProxy implements IProgrammer {
private IProgrammer p;
public ProgrammerProxy(IProgrammer p){
this.p=p;
}
@Override
public void useLanguage() {
Console.println("事务处理之前 ");
p.useLanguage();
Console.println("事务处理之后");
}
}
动态代理实现
4.ProgrammerProxyInvocationHandler
package base.tunie.designpattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import base.tunie.tools.test.Console;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:47:45
* @Desc:
*/
public class ProgrammerProxyInvocationHandler implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
Console.println("事务处理之前");
result=method.invoke(target, args);
Console.println("事务处理之后");
return result;
}
}
5.Console
package base.tunie.tools.test;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:34:06
* @Desc:后台打印相关
*/
public class Console {
/**
* 后台打印一个对象
* @param t
*/
public static <T> void print(T t){
System.out.print(t);
}
/**
* 后台打印一个对象,并换行
* @param t
*/
public static <T> void println(T t){
System.out.println(t);
}
/**
* 后台打印一个对象,并换行
* @param t
*/
public static void println(){
System.out.println();
}
}
6.ProxyText
package base.tunie.designpattern.proxy;
import base.tunie.tools.test.Console;
/**
* @author:Xie Jun
* @date: 2014-4-19 下午3:27:13
* @Desc:代理测试类
*/
public class ProxyText {
/**
* @param args
*/
public static void main(String[] args) {
Console.println("静态代理,由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了");
IProgrammer p=new AS3Programmer();
p=new ProgrammerProxy(p);
p.useLanguage();
Console.println();
Console.println("动态代理,在程序运行时,运用反射机制动态创建而成");
ProgrammerProxyInvocationHandler ppih=new ProgrammerProxyInvocationHandler();
IProgrammer p2=(IProgrammer)ppih.bind(new AS3Programmer());
p2.useLanguage();
}
}