首先需要的了解下代理,用一个生活中的例子来做类比—代购。客户原来是直接向厂家购买商品,但是有了代购商后,客户不再直接与厂家打交道,而是通过代购商来间接和厂家交流,这个代购商就是代理。如果用代码的逻辑思想去理解的话,可以想象原来客户类是直接调用委托类接口,而现在多了代理,多了个中间层,二者之间通过代理中间层交流,客户类不知道委托类具体的实现逻辑,而委托类也实现了与客户类之间的解耦,委托类可以在客户类需要的情况下,不修改自己的代码,完成一些额外的逻辑处理。
代理分为静态代理与动态代理,这里先了解下静态代理
以下是静态代理的demo代码:
public class StaticProxyDemo {
static interface Iservice {
void sayHello();
}
static class Service implements Iservice {
@Override
public void sayHello() {
System.out.println("say hello~~~~~");
}
}
static class StaticProxy implements Iservice {
private Iservice service;
public StaticProxy(Iservice service) {
this.service = service;
}
@Override
public void sayHello() {
System.out.println("before--say hello");
service.sayHello();
System.out.println("after--say hello");
}
}
public static void main(String[] args) {
Service service=new Service();
StaticProxy proxy = new StaticProxy(service);
proxy.sayHello();
}
}
运行结果:
从以上思路简析下静态代理的实现思路,首先需要有一个被代理的接口,该接口会有不同的实现类,然后创建出一个静态代理类,该类持有接口实例,然后具体调用的是接口的哪个实现类中的方法,由该静态代理类的构造函数的参数决定,所以静态代理类可以根据被代理类的不同实现类实例,来决定调用的是哪个实现类的方法逻辑,同时还能在调用时,为每个方法加入一些额外的处理逻辑。不过缺点也很明显,一个就是代码在写好时就是固定的,代理关系在编译期就固定了,所以一旦有较多的接口类需要用到代理,那么就会需要新建很多代理类,代码就显得很繁琐了。