代理模式 | 密室之门:神秘的守护者

在魔法城堡的深处,丽莎和艾瑞克发现了一个巨大的密室之门。那扇门上镌刻着古老的符文,看起来有着数千年的历史。而站在那扇门前的,是一名身着盔甲的守卫者。

“你不能直接进入,”守卫者向丽莎说,“我是这扇门的代理者。只有通过我,你才能打开这扇门。”

艾瑞克对丽莎解释:“这名守卫者是这扇密室门的代理,他控制着对这扇门的访问。这其实就是代理模式在魔法世界的体现。”

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();
    }
}

丽莎反思道:“这样,我们就可以节省大量的资源,只在必要时进行真正的操作。”

艾瑞克点点头:“没错。这种按需加载的策略在很多系统和应用中都得到了广泛使用。代理模式为我们提供了一个结构,使得我们可以更加灵活地控制对象的访问。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值