假设我有一个Door类和一个Lock类。Door类的实例有一个lock
属性,它是Lock类的一个实例。
我希望门"拥有"它的锁的实例,但我不希望门能够改变自己的锁。例如我不希望这是可能的:
class FancyDoor extends Door {
function unlockMyself() {
$this->lock->locked = false;
}
}
但是我确实想要一个门的锁可以被其他类访问。例如,我需要一个DoorMan类来锁定和解锁门。所以这并不是把所有的Lock属性都设为私有那么简单。
有这样做的模式吗?我主要在PHP工作,但答案确实需要是特定的语言。
我猜你担心的是,一旦FancyDoor在没有 unlockMyself
方法的情况下编码了,将来某些开发人员可能会无意中添加它并破坏合同。
如果lock
由Door
拥有,考虑到类的本质,避免这种情况将非常困难。我能想到如下:
-
Door
没有lock
实例。 -
Lock
被建模为一个单独的类。你可以使用状态模式,因为:- 你可能想要添加更多的状态,除了
lock
和unlock
,在未来。 - 相同的类可以在将来重用以使用,例如
Window
s。它不需要与Door
s绑定。
- 你可能想要添加更多的状态,除了
- 一个
DoorManager
或由这两个物体组成的东西。该类公开了用于锁定/解锁Door
实例的方法。
本质上,DoorManager
负责一个Door
,以及与之相关联的Lock
。