代理模式:为其他对象提供一种代理以控制对这个对象的访问。
三种:
1、静态代理:代理类与目标类有一样的继承父类和实现接口
2、动态代理(JDK代理):代理类不用实现目标类的接口,不会出现大量代理类的现象,一般情况下创建一个代理类就可以了
3、Cglib代理:通过继承完成。也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展
应用:
1、远程代理,为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。
例:在应用程序的项目中加入一个Web应用,引用一个WebService,此时会在项目中生成一个WebReference的文件夹和一些文件,它们就是代理,这就使得客户端程序调用代理就可以解决远程访问的问题。
2、虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
例:打开一个网页时,里面有可能有很多的
3、安全代理,用来控制真实对象访问时的权限。
4、智能指引,指当调用真实的对象时,代理处理另外一些事。
一个主题接口,真实类去实现这个接口,代理类实现主题接口,含有主题接口的对象属性,在实现接口的方法中调用真实主题的实现方法,在实现方法前后可增加想要的操作。完成对真实实现的代理。
/**
* 主题接口
*/
public interface Subject {
void eat();
void drink();
}
/**
* 真实主题
*/
public class RealSubject implements Subject{
@Override
public void eat() {
System.out.println("真实执行吃");
}
@Override
public void drink() {
System.out.println("真实执行喝");
}
}
/**
* 代理类
*/
public class ProxySubject implements Subject{
private Subject subject;
public ProxySubject() {
}
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void eat() {
System.out.println("代理吃之前的动作");
this.subject.eat();
System.out.println("代理吃之后的动作");
}
@Override
public void drink() {
System.out.println("代理喝之前的动作");
this.subject.drink();
System.out.println("代理喝之后的动作");
}
}
public class Main {
public static void main(String[] args) {
Subject subject = new ProxySubject(new RealSubject());
subject.eat();
subject.drink();
}
}