使用一个代理对象将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。
静态代理
代理类和被代理类在编译期间,就确定下来了
interface clothFactory{
void productCloth();
}
//代理类
class proxyClothFac implements clothFactory{
private clothFactory clothFactory;
public proxyClothFac(clothFactory clothFactory) {
this.clothFactory=clothFactory;
}
@Override
public void productCloth() {
System.out.println("代理工厂 start..");
clothFactory.productCloth();
System.out.println("代理工厂 end..");
}
}
//被代理类
class nikeFactory implements clothFactory{
@Override
public void productCloth() {
System.out.println("nike生产衣物");
}
}
public class staticProxy {
public static void main(String[] args) {
//被代理类对象
nikeFactory nikeFactory = new nikeFactory();
//创建代理类对象
proxyClothFac proxyClothFac = new proxyClothFac(nikeFactory);
proxyClothFac.productCloth();
}
}
动态代理
代理类一开始不知道自己真实代理的对象,当首次使用代理类时传入需要代理的对象(实现动态代理)
interface human{
void eat(String food);
}
//被代理类
class superMan implements human{
@Override
public void eat(String food) {
System.out.println(food+"好吃");
}
}
//代理类
class proxyFactory{
//调用方法 返回一个代理类对象
public static Object getProxyInstance(Object obj){
myInvokeHandler handler = new myInvokeHandler();
handler.bind(obj);
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
handler);
}
}
//实际调用方法的地方
class myInvokeHandler implements InvocationHandler{
private Object obj;
public void bind(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理类对象调用的方法
System.out.println("代理类对象方法调用");
return method.invoke(obj, args);
}
}
public class dynamicProxy {
public static void main(String[] args) {
superMan superMan = new superMan();
//当通过创建代理类对象时 实现的是它们共同的接口(类似于匿名内部类)
//传入真实需要代理的对象
human proxyInstance = (human) proxyFactory.getProxyInstance(superMan);
proxyInstance.eat("牛肉干");
//动态调用前面静态代理中的方法
clothFactory proxyInstance1 = (clothFactory) proxyFactory.getProxyInstance(new nikeFactory());
proxyInstance1.productCloth();
}
}