本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
在“资源”部分添加指向原始文章的链接。
代理模式是一种软件设计模式,它为另一个提供代理或占位符对象。在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构模式。
有四种类型的代理模式:
在本文中,我们将重点关注虚拟代理模式。
虚拟代理是代表另一个对象的对象。真正的对象只在需要的时候创建。例如,从远程服务器加载的图像。图像由代理对象表示。代理对象处理图像请求。加载图像时,代理对象将自己替换为真实图像对象。
虚拟代理可用于:
我们将使用以下示例来演示虚拟代理模式。我们有一个代表用户的 User 类。 User 类有一个名字和一个头像。化身是图像。我们将使用虚拟代理来表示头像图像。
class User(val name: String, val avatar: Image)
Image 类表示图像。 Image 类具有宽度和高度。
class Image(val width: Int, val height: Int)
ImageProxy 类是 Image 类的代理。 ImageProxy 类引用了 Image 类。 ImageProxy 类也有一个加载标志。加载标志用于跟踪 Image 类是否正在加载。
class ImageProxy(val image: Image) {
val loading = false
}
loadImage() 函数用于加载 Image 类。 loadImage() 函数接受一个图像 URL 和一个回调函数。加载图像时调用回调函数。
fun loadImage(imageUrl: String, callback: (Image) -> Unit) {
// TODO: load image from URL
}
main() 函数创建一个带有 ImageProxy 对象的 User 对象。 ImageProxy 对象表示头像图像。 loadImage() 函数用于加载头像图像。加载图像时,ImageProxy 对象将替换为 Image 对象。
fun main() {
val user = User("Alice", ImageProxy(null))
loadImage("avatar.jpg") { image ->
user.avatar = image
}
}
在以下情况下应使用虚拟代理模式:
虚拟代理模式具有以下优点:
虚拟代理模式有以下缺点: