【问题标题】:Pattern for class attribute that can only be altered by others只能由其他人更改的类属性的模式
【发布时间】:2017-02-18 08:51:38
【问题描述】:

假设我有一个 Door 类和一个 Lock 类。 Door 类的实例有一个 lock 属性,它是 Lock 类的一个实例。

我希望门“拥有”它是 Lock 的实例,但我不希望门能够更改自己的锁。例如,我不希望这成为可能:

class FancyDoor extends Door {
    function unlockMyself() {
        $this->lock->locked = false;
    }
}

但我确实希望其他班级可以使用门锁。例如,我需要一个 DoorMan 类来锁定和解锁门。所以这并不像将所有 Lock 属性都设为私有那么简单。

有这样做的模式吗?我主要在 PHP 中工作,但答案确实需要特定于语言。提前致谢。

【问题讨论】:

    标签: class inheritance design-patterns visibility class-visibility


    【解决方案1】:

    我假设您担心的是,一旦 FancyDoor 被编码unlockMyself 方法,将来某些开发人员可能会无意中添加它并搞砸合同。

    如果lockDoor 所有,考虑到类的本质,避免这种情况将非常困难。我可以想到以下几点:

    • Door 没有 lock 实例。
    • Lock 被建模为一个单独的类。您可以使用状态模式,因为:
      • 除了lockunlock,将来您可能还想添加更多状态。
      • 以后可以重复使用相同的类来处理Windows。它不需要与Doors 绑定。
    • DoorManager 或由这两个对象组成的东西。此类公开了用于锁定/解锁其拥有的 Door 实例的方法。

    本质上,DoorManager 负责一个Door,以及与之关联的Lock

    【讨论】:

    • 对。这就是我现在正在做的事情,但它非常笨重,因为我总是必须一起通过门和锁,并且经理必须跟踪谁是谁。
    • 将它们放在一个类中并传递该类的对象,而不是分别传递它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2021-11-25
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多