类属性的模式,只能由其他人更改

时间:2016-10-09 23:53:12

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

所以假设我有一个Door类和一个Lock类。 Door类的实例具有lock属性,该属性是Lock类的实例。

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

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

但我确实希望其他课程可以使用门锁。例如,我需要一个DoorMan课程才能锁定和解锁门。所以它并不像将所有Lock属性设为私有一样简单。

这样做有什么模式吗?我主要使用PHP,但答案确实需要特定于语言。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我假设您关注的是,一旦FancyDoor编码而没有 unlockMyself方法,将来某些开发人员会无意中添加它并搞砸合同。

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

  • Door没有lock个实例。
  • Lock被建模为一个单独的类。你可以使用State Pattern,因为:
    • 您可能希望在将来添加更多状态,lockunlock除外。
    • 将来可以重复使用同一个班级来处理Window s。它不需要与Door s。
    • 绑定
  • A DoorManager或由这两个对象组成的东西。此类公开了锁定/解锁它所拥有的Door实例的方法。

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