1.说明:借用歌星与经济人(代理)在现实生活中的关系来阐述代理模式;
2.代码
2.1明星接口
public interface Star{
void confer();
void signContract();
void bookTicket();
void sing();
void collectMoney();
}
2.2真实明星实现明星接口
package 代理模式1.动态代理;
public class RealStar implements Star {
@Override
public void confer() {
// TODO Auto-generated method stub
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
// TODO Auto-generated method stub
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
// TODO Auto-generated method stub
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("RealStar(周杰伦).sing()");
}
@Override
public void collectMoney() {
// TODO Auto-generated method stub
System.out.println("RealStar.collectMoney()");
}
}
2.3明星助手类实现java.lang.reflect.InvocationHandler接口,重写其public Object invoke(Object proxy, Method method, Object[] args)方法
package 代理模式1.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler{
Star realStar;
public StarHandler(Star realStar){
super();
this.realStar = realStar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object = null;
System.out.println("正真的方法执行前");
if("sing".equals(method.getName())){
object = method.invoke(realStar, args);
}
System.out.println("真正的方法执行后");
return object;
}
}
2.4在Client类中进行调用
package 代理模式1.动态代理;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
//订票
proxy.bookTicket();
//唱歌
proxy.sing();
}
}
3.输出结果:
正真的方法执行前
真正的方法执行后
正真的方法执行前
RealStar(周杰伦).sing()
真正的方法执行后