1

因此我們假設我有一個Door類和一個Lock類。 Door類的實例具有一個lock屬性,該屬性是Lock類的一個實例。只能被其他人修改的類屬性模式

我想門「擁有」它是鎖定的實例,但我不想讓門能夠改變自己的鎖。例如,我不希望這是可能的:

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

但我確實希望有一個門的鎖被其他類訪問。例如,我需要一個DoorMan類來鎖定和解鎖門。所以這並不像將所有Lock屬性設爲私有一樣簡單。

是否有這樣一種模式?我主要使用PHP,但答案確實需要語言特定。提前致謝。

回答

0

我假設你關注的是,一旦FancyDoor已編碼沒有unlockMyself方法,在未來的一段開發者可以在不經意間將其添加和螺釘的合同。

考慮到類的本質,如果lockDoor所以避免這將是非常困難的。我可以想到以下幾點:

  • Door沒有lock實例。
  • Lock被建模爲一個單獨的類。您可以使用狀態模式,因爲:
    • 將來您可能想要添加更多的狀態,除了lockunlock之外。
    • 同一個類可以被重用在未來,說幹就幹,Window秒。它不需要與Door s捆綁在一起。
  • A DoorManager或者是由這兩個對象組成的東西。該類提供了鎖定/解鎖其實例的方法。

實質上,DoorManager負責一個Door,和與它相關的Lock

+0

對。這就是我現在正在做的事情,但這是一個非常笨拙的事情,因爲我總是必須把門和鎖合在一起,經理必須跟蹤誰是誰的。 – emersonthis

+0

把他們兩個放在一個類中,並傳遞該類的對象,而不是單獨傳遞它們。 –