代理设计模式
代理模式就是多一个代理类出来,替原对象进行一些操作。比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。
适用性
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
uml
由Traced by User:Stannered, created by en:User:TravisHein - en:Image:Proxy pattern diagram.png,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1989403
例子
首先需要一个接口,这里我们定义一个负责显示图片的接口:
public interface Image {
void displayImage();
}
然后需要一个实现该接口的类,负责实现显示图片的方法:
/**
* 真实图片对象
*/
public class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading " + filename);
}
@Override
public void displayImage() {
System.out.println("Displaying " + filename);
}
}
然后再来一个代理类,用来代理真实的显示图片的对象:
/**
* 代理图片对象
*/
public class ProxyImage implements Image {
private String filename;
private Image image;
public ProxyImage(String filename) {
this.filename = filename;
}
@Override
public void displayImage() {
if (image == null) {
image = new RealImage(filename);
}
image.displayImage();
}
}
最后是测试类:
/**
* 代理客户端测试类
*/
public class ProxyExample {
public static void main(String[] args) {
Image image1 = new ProxyImage("图片1");
Image image2 = new ProxyImage("图片2");
image1.displayImage();
image2.displayImage();
}
}
结果:
参考:
https://zh.wikipedia.org/wiki/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F#Java
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html