代理模式
约 447 字大约 1 分钟
2025-07-08
<?php
// 接口:定义了服务接口
interface Image {
public function display();
}
// 具体类:实现了服务接口
class RealImage implements Image {
private $filename;
public function __construct($filename) {
$this->filename = $filename;
$this->loadImageFromDisk();
}
private function loadImageFromDisk() {
echo "Loading image {$this->filename}<br>";
}
public function display() {
echo "Displaying image {$this->filename}<br>";
}
}
// 代理类:包含了对真实服务对象的引用
class ImageProxy implements Image {
private $filename;
private $realImage;
public function __construct($filename) {
$this->filename = $filename;
}
// 当需要显示图像时,首先创建真实对象
public function display() {
if ($this->realImage == null) {
$this->realImage = new RealImage($this->filename);
}
$this->realImage->display();
}
}
// 客户端代码
$image = new ImageProxy("test.jpg");
// 图像将从磁盘加载
$image->display();
// 图像将不再从磁盘加载
$image->display();
在这个示例中,Image 接口定义了一个显示图像的方法 display()。RealImage 类实现了 Image 接口,它代表了真正的图像对象,负责从磁盘加载图像并显示。ImageProxy 类也实现了 Image 接口,它包含了一个对真实图像对象的引用,并在需要时创建真实对象,然后调用真实对象的 display() 方法。客户端代码通过创建 ImageProxy 对象来显示图像,而不需要直接操作 RealImage 对象。
代理模式的主要优点在于:
- 代理模式可以隐藏真实对象的具体实现细节,使客户端无需知道真实对象的存在。
- 代理对象可以在访问真实对象之前或之后执行额外的操作,例如权限控制、缓存等。
在这个示例中,代理类 ImageProxy 在调用真实对象的 display() 方法之前,检查是否已经创建了真实对象,如果没有则创建。这种延迟加载的技术可以节省资源,并提高性能。