JDK动态代理借助接口实现,目标类需是接口形式,代理类继承InvocationHandler类,通过反射方式动态创建目标类。
1.目标对象
public interface ByShoot {
void byShoot(String size);
}
public class ShootFactory implements ByShoot{
@Override
public void byShoot(String size) {
System.out.println("已经为您生产出了尺码为"+size+"的鞋子");
}
}
2.代理类 关键字继承InvocationHandler类
public class LisiFactory implements InvocationHandler {
// 被代理的对象
private Object factory ;
public Object getFactory() {
return factory;
}
public void setFactory(Object factory) {
this.factory = factory;
}
//ssm: Spring SpringMVC mybitys
//Spring:AOP IOC +....
//AOP:代理 (面向切面的编程)
// 通过代理对象对方法进行增强
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
FrontService();
Object retObject = method.invoke(factory, args); //这里用了反射的思想,因为我们不知道调用的是那个工厂的那个方法
endService();
return null;
}
// 前置服务
public void FrontService() {
System.out.println("根据您的需求进行市场调研");
}
// 后置服务
public void endService() {
System.out.println("为您提供一条龙的包办服务");
}
//调度员工
/**
* 1 新建一名员工
* 2.告诉员工工厂地址
* this:绑定
* @return
*/
public Object getProxyInstance() {
// TODO Auto-generated method stub
return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
}
}
3.测试类,买家
public class Test {
public static void main(String[] args) {
ClothesFactory clothesFactory = new ClothesFactory();
ShootFactory shootFactory = new ShootFactory();
LisiFactory lisiFactory = new LisiFactory();
lisiFactory.setFactory(shootFactory);
ByShoot yuangong1 = (ByShoot) lisiFactory.getProxyInstance();
yuangong1.byShoot("42");
lisiFactory.setFactory(clothesFactory);
ByClothes yuangong = (ByClothes) lisiFactory.getProxyInstance();
yuangong.clothes("XXL");
}
}