设计模式 - 浅谈代理模式
代理模式
模式功能说明:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
模式思路与原理
在代理模式中,一个类代表另一个类的功能。在代理中,我们创建具有现有对象的对象,以便向外界提供功能接口。
代码示例
interface Image {
void display();
}
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + filename);
}
}
class ProxyImage implements Image {
private RealImage realImage;
private String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display();
System.out.println("");
image.display();
}
}
新建了一个Image接口
和实现了Image接口
的实体类。ProxyImage
是一个代理类,减少RealImage
对象加载的内存占用。
使用场景:
- 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实。
- 虚拟代理,这种方式通常是为了完成在需要的时候创建大型对象。
- 安全代理,这种方式通常是为了控制真实对象访问时的权限。
- 智能指引,这是一种当调用真实的对象时,代理处理另外一些事。
优缺点
优点:
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
- 代理对象在客户端和目标对象之间起到中介的作用,这样可以起到保护目标对象的作用。
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
总结
代理模式使用了设计原则有:开闭原则(对扩展开放,对修改关闭)和单一职责原则(一个类只做一件事情)。 它在需要控制对原始对象的访问时非常有用,它可以作为一个层或接口以支持分布式访问,控制访问,或添加特殊的方式(如:记录日志,检查权限等)。