对象内的依赖关系

dan*_*car 7 oop design-patterns

我有这个代码

class Duck {
  protected $strVocabulary;
  public function Learn() {
   $this->strVocabulary = 'quack';
  }

  public function Quack() {
   echo $this->strVocabulary;
  }
}

代码是PHP,但问题不依赖于PHP.在它知道嘎嘎之前,鸭子必须学习.

我的问题是:如何在Quack()调用之后才能调用Learn()

Dav*_*Far 3

不,这并不违反任何 OOP 原则。

一个突出的例子是一个对象,其行为取决于是否建立连接(例如,函数doNetworkStuff()取决于openConnection())。

在Java中,甚至还有一个类型状态检查器,它在编译时执行此类检查(是否Duck可以Quack())。我经常有这样的依赖关系作为接口的先决条件,并使用转发类,其唯一目的是协议和检查它转发到的对象的状态,即协议在对象上调用了哪些函数,并在以下情况抛出异常(例如 InvalidStateException)不满足先决条件。

处理这个问题的设计模式是状态:它允许对象在其内部状态发生变化时改变其行为。该对象似乎会更改其类别。四人帮的设计模式书也使用了上面的网络连接已建立或未建立的示例。