在魔法城堡的深处,丽莎和艾瑞克发现了一个巨大的密室之门。那扇门上镌刻着古老的符文,看起来有着数千年的历史。而站在那扇门前的,是一名身着盔甲的守卫者。
“你不能直接进入,”守卫者向丽莎说,“我是这扇门的代理者。只有通过我,你才能打开这扇门。”
艾瑞克对丽莎解释:“这名守卫者是这扇密室门的代理,他控制着对这扇门的访问。这其实就是代理模式在魔法世界的体现。”
interface Door {
void open();
}
class AncientDoor implements Door {
@Override
public void open() {
System.out.println("Ancient door is opening...");
}
}
class DoorProxy implements Door {
private Door realDoor;
public DoorProxy(Door realDoor) {
this.realDoor = realDoor;
}
@Override
public void open() {
System.out.println("Checking permissions...");
if (checkAccess()) {
realDoor.open();
} else {
System.out.println("Access denied.");
}
}
private boolean checkAccess() {
// Some complex logic to check access
return true;
}
}
艾瑞克继续:“在现实业务中,代理模式也广泛应用。它的核心是提供一个代理对象,替真实对象进行操作。这样,除了直接操作,还可以添加额外的逻辑,如权限检查、懒加载、或日志记录。”
考虑在线视频播放的场景。视频可能存储在远程服务器上,直接加载大型视频文件可能会很慢。代理模式可以允许我们先加载预览或小的占位符,然后在需要时再加载完整的视频。
interface Video {
void display();
}
class RealVideo implements Video {
private String filename;
public RealVideo(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading video: " + filename);
}
@Override
public void display() {
System.out.println("Playing video: " + filename);
}
}
class ProxyVideo implements Video {
private RealVideo realVideo;
private String filename;
public ProxyVideo(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realVideo == null) {
realVideo = new RealVideo(filename);
}
realVideo.display();
}
}
丽莎反思道:“这样,我们就可以节省大量的资源,只在必要时进行真正的操作。”
艾瑞克点点头:“没错。这种按需加载的策略在很多系统和应用中都得到了广泛使用。代理模式为我们提供了一个结构,使得我们可以更加灵活地控制对象的访问。”