当我们可以推迟 RealClass 中昂贵的过程时,为什么还要费心使用代理模式呢?
Why bother using the proxy pattern when we can defer the expensive procedures in the RealClass?
我最近在看Design Patterns,关于代理模式我有些不明白。
书中引述:
- A virtual proxy creates expensive objects on demand. The ImageProxy described in the Motivation is an example of such a proxy.
我了解到此模式可用于按需创建昂贵的对象。
而this example也很好地说明了用法。
下面是代理classRealImage
的构造函数。方法loadFromDisk()
表示昂贵的过程。
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
the example 中的代理 class ProxyImage
做的正是它打算做的事情:按需创建昂贵的对象。
但我的问题是:为什么我们不能从构造函数中删除昂贵的loadFromDisk()
方法并将其放在绝对需要的地方,
喜欢这里吗?
public void display() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then display
}
那么为什么还要使用代理呢?
代理模式在这种情况下解决的问题是代码重复。想象一下这样一种情况,您有许多类似于 display()
的方法,其中需要检查 loaded
标志。您的代码将如下所示:
public void display() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then display
}
public void resize(double scale) {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then resize
}
... // more methods go here
public void save() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then save
}
即使您将if(!loaded){...
代码放入一个方法中并从所有方法中调用它,您也需要记住执行调用。这很容易出错,并且可能会在以后导致问题,特别是对于刚进入该项目的新程序员。
我最近在看Design Patterns,关于代理模式我有些不明白。
书中引述:
- A virtual proxy creates expensive objects on demand. The ImageProxy described in the Motivation is an example of such a proxy.
我了解到此模式可用于按需创建昂贵的对象。 而this example也很好地说明了用法。
下面是代理classRealImage
的构造函数。方法loadFromDisk()
表示昂贵的过程。
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
the example 中的代理 class ProxyImage
做的正是它打算做的事情:按需创建昂贵的对象。
但我的问题是:为什么我们不能从构造函数中删除昂贵的loadFromDisk()
方法并将其放在绝对需要的地方,
喜欢这里吗?
public void display() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then display
}
那么为什么还要使用代理呢?
代理模式在这种情况下解决的问题是代码重复。想象一下这样一种情况,您有许多类似于 display()
的方法,其中需要检查 loaded
标志。您的代码将如下所示:
public void display() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then display
}
public void resize(double scale) {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then resize
}
... // more methods go here
public void save() {
if(!loaded){
loadFromDisk(fileName);
loaded = true;
}
//then save
}
即使您将if(!loaded){...
代码放入一个方法中并从所有方法中调用它,您也需要记住执行调用。这很容易出错,并且可能会在以后导致问题,特别是对于刚进入该项目的新程序员。