Java的代理分为静态代理和动态代理,静态代理因为违反开闭原则,一次只能代理一个对象,缺少实用性,所以一般用的很少,所以只记一下动态代理。
动态代理定义:为其它对象提供一种代理以控制对这个对象的访问控制;在某些情况下,客户不想或者不能直接引用另一个对象,这时候代理对象可以在客户端和目标对象之间起到中介的作用。
举一个实际的例子,比如我想要买一包烟,但生产这包烟的是卷烟厂,我不可能直接去卷烟厂去买,所以现在就需要一个商店作为代理,向消费者销售卷烟厂生产的香烟,在这里商店就是代理类。
首先我们写一个SaleTools接口,提供了卖东西的方法。
/**
* 售卖方式
*/
public interface SaleTools {
void saleCigarette();
}
然后定义一个实现了SaleTools的类CigarFactory ,我们可以把它看成实际的卷烟厂,通过saleCigarette()方法生产并销售香烟。
/**
* 卷烟厂
*/
public class CigarFactory implements SaleTools{
@Override
public void saleCigarette() {
System.out.println("----------卖了一包烟");
}
}
然后定义代理类StoreProxy
/**
* 商店 代理类
*/
public class StoreProxy implements InvocationHandler {
private Object factory;
public void setFactory(Object factory) {
this.factory = factory;
}
void before() {
System.out.println("----选择品牌,进了一批香烟");
}
void after() {
System.out.println("-----卖完数钱------");
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(factory, args);
after();
return result;
}
}
在这个类里