什么是代理模式
代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
代理模式的优点
中介隔离作用:
在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:
代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。(就像 service 与 dao 的之间的关系似的,使得委托类中的作用更加的纯粹)
真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
举例
规范接口(Image )
public interface Image {
void display();
}
委托类(RealImage)
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
System.out.println("Displaying: " + fileName);
}
}
代理类(ProxyImage)
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
// 第一次调用前,我们需要做一些处理
otherOpt(fileName);
realImage = new RealImage(fileName);
}
realImage.display();
}
private void loadFromDisk(String fileName){
System.out.println("other opration ...");
}
}
主方法(main)
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("demo.jpg");
// 第一次操作
image.display();
System.out.println("---------------------");
// 第二次操作
image.display();
}
}
结果
other opration ...
Displaying: demo.jpg
---------------------
Displaying: demo.jpg