百度百科说:代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用
使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的。当然,代理类与目标类要实现同一个接口。
静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立。
下面给出静态代理的实现:
业务接口:
package proxy;
/**
* 代理的接口类,该类中的方法需要被代理 -》 实现增强
* @author gmcc
*
*/
public interface ISomeService {
String doSome();
String doOther();
}
目标类:业务的实现类
package proxy;
/**
* 目标类:需要被代理的类实现增强的类
* @author gmcc
*
*/
public class SomeServiceImpl implements ISomeService{
@Override
public String doSome() {
return "hello world!";
}
@Override
public String doOther() {
return "hi, Java!";
}
}
代理类
package proxy;
/**
* 代理类:对目标类对象进行代理
* @author gmcc
*
*/
public class ServiceProxy implements ISomeService{
//需要代理的目标对象
private ISomeService target;
public ServiceProxy(ISomeService target) {
this.target = target;
}
@Override
public String doSome() {
//调用目标对象的目标方法
String result = target.doSome();
//对目标方法返回的值进行改变,这里将小写变为大写
return result.toUpperCase();
}
@Override
public String doOther() {
//如果不需要对目标对象的该方法进行改变,则直接调用目标方法即可,不对其返回结果做任何处理。
String result = target.doOther();
return result;
}
}
调用测试
package proxy;
public class ProxyTest {
public static void main(String[] args) {
//获取目标对象
ISomeService target = new SomeServiceImpl();
//目标对象target需要代理,则传递自身得到它的代理对象proxy
ISomeService proxy = new ServiceProxy(target);
//需要对方法的结果进行改变就通过代理对象来调用目标方法来实现改变。
System.out.println(proxy.doSome());
//不需要对方法的结果进行改变则直接调用目标对象的方法。
System.out.println(target.doOther());
}
}
测试结果如下:
可以从结果看到,对target目标对象的doSome()方法返回的“hello world!”,其静态代理对象proxy对其进行了增强,将其结果转变为了全大写“HEELO WORLD!”,也就是说,客户真正想访问的是目标对象target,而实际上它访问到的是target目标对象的代理对象proxy,代理对象在这中间做了“中介”,这就是代理。