- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的例子中,来自维基书籍https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Proxy
我不确定这比仅仅创建真实对象并使用它的显示图像更快/更有效。因为代理在 displayImage 方法中创建了真实的对象?
//on System B
class ProxyImage implements Image {
private RealImage image = null;
private String filename = null;
/**
* Constructor
* @param FILENAME
*/
public ProxyImage(final String FILENAME) {
filename = FILENAME;
}
/**
* Displays the image
*/
public void displayImage() {
if (image == null) {
image = new RealImage(filename);
}
image.displayImage();
}
}
如果您不使用代理,代理模式肯定不会节省内存,因为它需要实例化两个对象(代理和真实)而不是一个(真实)?
最佳答案
从您发布的链接(强调我的):
The proxy class
ProxyImage
is running on another system than the real image class itself and can represent the real imageRealImage
over there. The image information is accessed from the disk. Using the proxy pattern, the code of theProxyImage
avoids multiple loading of the image, accessing it from the other system in a memory-saving manner.
简而言之:它不会节省内存,它会加快应用程序的速度,因为您不需要每次都访问磁盘来读取真实图像。
这部分代码证明了这一点:
public void displayImage() {
//if image is not loaded into memory
if (image == null) {
//then load it, go to disk only once
image = new RealImage(filename);
}
//now it is in memory, display the real image
image.displayImage();
}
为了更好地理解这个问题,让我们更改类和接口(interface)的定义:
public interface Image {
String getName();
byte[] getData();
}
现在,RealImage
类将始终在磁盘中寻找数据,以防文件不存在(已删除或重命名):
public class RealImage implements Image {
//implements all the operations going to disk...
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
}
@Override
public String getName() {
String name = "";
//fancy operations to seek for the file in disk (in case it has been deleted)
//read the data from file in disk
//get the name
name = ...;
return name;
}
@Override
public byte[] getData() {
byte[] data;
//again, fancy operations to seek for the file in disk (in case it has been deleted)
//read the data from file in disk
//get the image data for displaying purposes
data = ...;
return data;
}
}
现在,我们好的 ProxyImage
将充当 RealImage
的代理,通过将数据保存到内存中来节省每次转到磁盘的高成本任务:
public class ProxyImage implements Image {
private String fileName;
private RealImage realImage;
private byte[] data;
private String name;
//implements all the operations going to disk...
public RealImage(String fileName) {
this.fileName = fileName;
}
@Override
public String getName() {
//in case we don't have the name of the image
if (this.name == null) {
//use a RealImage to retrieve the image name
//we will create the instance of realImage only if needed
if (realImage == null) {
realImage = new RealImage(fileName);
}
//getting the image from the real image is highly costly
//so we will do this only once
this.name = realImage.getName();
}
return this.name;
}
@Override
public byte[] getData() {
//similar behavior for the data of the image
if (this.data == null) {
if (realImage == null) {
realImage = new RealImage(fileName);
}
//highly costly operation
this.data = realImage.getData();
}
return this.data;
}
}
因此反射(reflect)了为我们的 RealImage
使用代理的优点。
关于java - 代理模式 : how is it more efficent that creating the real object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23297314/
我在决定是将我的应用程序归类为“实时”还是“接近实时”,或者甚至是其他类别时遇到了麻烦。 该软件会立即接收从源生成的数据,然后根据某些规则,在满足某些条件时发出警报。它采用每 30 秒检查一次最近 3
我的 c 编译器有问题当编译一个简单的hello world时,用户时间是>>>实时的。 这里是两台机器之间的时间比较。 需要注意的是,机器没有执行任何其他任务,其他操作运行得很快(甚至是其他编译器)
虽然我用 C 实现了很多项目,但我对操作系统完全陌生。我在探索板 (STM32) 上尝试了实时 linux,并得到了 LED 闪烁的正确结果,但我并没有真正理解整个过程,因为我只是按照步骤操作,无法在
我的问题是,“可以使用 select type block 来区分 real::realInput 和 real::realArrayInput(:) ?”很清楚 select type 可以如何用于
通过 fortran-iso-c-binding,我可以连接 C 函数并获取类似类型的变量 real(c_float) integer(c_int) 但在程序的其余部分我想使用基本类型(仅仅是因为我不
我正在编写一个应用程序,在某个 block 中我需要对实数取幂大约 3*500*500 次。当我使用 exp(y*log(x)) 算法时,程序明显滞后。如果我使用另一种基于处理数据类型的算法,速度会快
我目前在 science linux 6 下使用 gfortran 4.4.7 编译器。我需要用 128 位声明变量。我无法更改操作系统希望在science linux 6下能做一些事情。 最佳答案
当我在 .NET 中将进程的优先级设置为实时时: Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
我正在使用 Accelerate Framework 在 iOS 中实现基于加速度计的 FFT,但我仍然有点困惑的是这一部分: /* The output signal is now in a spl
用 f(x::Real) 定义函数有什么区别吗?和 f{T <: Real}(x::T) ? @code_warntype给出相同的输出 function f(x::Real) x^2 end
所以我看到了these two questions on twitter . 1.real 是语法错误,而 1 .real 不是? >>> 1.real File "", line 1 1
我有这个简单的代码,它使用 DGEMM 例程进行矩阵乘法 program check implicit none real(8),dimension(2,2)::A,B,C A(1,1)=
如标题所示,我使用了 Media Foundation WavSink 示例,该示例将音频流解码为 PCM 并转储到文件。 我的应用程序是将此流定向到 FMOD 音频引擎,该引擎以实时速率使用 PCM
1) 独占时间是在方法中花费的时间2) 包含时间是在方法中花费的时间加上在任何被调用函数中花费的时间3)我们称调用方法为“ parent ”,称方法为“子”。引用链接:Click here 这里的问题
我正在尝试使用 PS3 Eye 实时执行到达时间差。由于它内置了4个麦克风阵列,我成功地将阵列重新排列成方形阵列,并使用MATLAB对信号进行互相关,得到了一个相对准确的TDOA算法。然而,到目前为止
我开始改进一些旧的 R 代码,发现下一个函数是 deprecated : real创建指定长度的 double 向量。向量的每个元素都等于 0。 as.real试图将其参数强制为 double 类型。
因此,得出以下结论:实时异常检测的定义是什么? 我正在研究异常检测领域,在许多论文中,该方法被定义为实时,而在许多其他论文中,它简称为异常检测。 我碰巧发现,纠正我是否我错了,大多数所谓的实时方法实际
查看所有现有的操作转换框架示例,它们似乎都解决了将更改转换为纯文本文档的问题。 OT 框架如何用于更复杂的对象? 我想开发一个实时便签样式的应用程序,人们可以在其中共同创建便签,更改他们的位置和文本值
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以使为on-topic。 4
我有大量的点数据流(二维)(每秒数千个)。在这张 map 上,我有几个固定的多边形(几十到几百个)。 我想实时确定(在相当强大的笔记本电脑上几毫秒的数量级)它所在的多边形(多边形可以相交)的每个点。我
我是一名优秀的程序员,十分优秀!