代理模式(Proxy)动态代理
介绍一下jdk自带动态代理。
java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler
使用动态代理,还可以完成对实现了某些接口的类的特定方法进行改造。
下面用代码来说明:
1.首先还是创建Star接口和真实明星的对象:
package com.note.pattern.proxy.dynamicproxy;
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signContract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
package com.note.pattern.proxy.dynamicproxy;
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("RealStar(周杰伦本人).sing()");
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
2.创建Handler类,继承InvocationHandler类即可:
package com.note.pattern.proxy.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler{
private Star mRealStar;
public StarHandler(Star star) {
mRealStar = star;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
System.out.println("真正的方法执行前!");
System.out.println("面谈,签合同,预付款,订机票");
if (method.getName().equals("sing")) {
object = method.invoke(mRealStar, args);
}
System.out.println("真正的方法执行后!");
System.out.println("收尾款");
return object;
}
}
3.代理对象可以在客户端直接创建:
package com.note.pattern.proxy.dynamicproxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler starHandler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class},starHandler);
proxy.sing();
}
}

浙公网安备 33010602011771号