静态代理模式非常简单.
静态代理的效果是,不直接使用目标类,而是使用一个代理角色,调用目标类中的方法,而可以封装更多的必要的方法.
代码实现:
1.目标类和代理类师出同门,都继承自Subject.
/**
* 代理角色与真实角色共有的真实接口
* Created by lbyl2 on 2016/11/20.
*/
public abstract class Subject {
/**
* 代理角色与真实角色都需要实现的方法
*/
public abstract void request();
}
2.目标类(真实类),包含简单的方法
public class RealSubject extends Subject{
@Override
public void request() {
System.out.println("来自真实的subject");
}
}
3.代理类,用单例包装真实类,并封装其他的方法
/**
* 代理角色
* Created by lbyl2 on 2016/11/20.
*/
public class ProxyObject extends Subject {
private RealSubject realSubject;//引用真实角色
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
preReuest();
realSubject.request();//真实角色完成的方法
postRequest();
}
/**
* 真实操作前附加的操作
*/
private void preReuest(){
System.out.println("真实动作之前的动作");
}
/**
* 真实操作之后附加的操作
*/
private void postRequest(){
System.out.println("真实动作之后的动作");
}
}
在实际调用中,只需创建代理角色并调用目标方法即可.
这样,看起来是调用了与目标类非常相似的方法,但实际上其中包含了额外定义的方法.
使用前提:真实角色必须是实现已经定义的,代理角色才能引用它.但是在实际使用中,这样会造成类的急剧膨胀;另外,如果实现不知道真实角色,如何使用代理?这时,我们需要动态代理来解决.