对象内的依赖关系

我有这个代码

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

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

该代码是在PHP中,但问题不是PHP的依赖。 在它知道要Qu鸭子之前必须学会。

我的问题是:只有在调用了Learn()之后,我如何才能使Quack()可调用?


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

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

在Java中,甚至还有一个类型状态检查器,它会在编译时执行这种检查( Duck是否已经可以使用Quack() )。 我经常有这样的依赖关系作为接口的先决条件,并使用一个转发类,其唯一目的是协议并检查它转发的对象的状态,即协议哪些函数已在对象上调用,并引发异常(例如InvalidStateException)前提条件不符合。

处理这种情况的设计模式是state:它允许对象在其内部状态改变时改变其行为。 该对象似乎会改变其类。 来自四人帮的设计模式书也使用上面的网络连接的例子,无论是建立还是不建立。


如果你想修改顺序,那么你可以使用抽象基类,在函数quack()中你先调用learn(),然后抽象方法doquack()(一些其他的好名字,这将必须由每个派生类)。


我的问题是:只有在调用了Learn()之后,我如何才能使Quack()可调用?

你可以分开担忧:

class EnrolleeDuck {
  public function Learn() {
   return new AlumnusDuck('quack');
  }
}

class AlumnusDuck
{
  protected $strVocabulary;

  public function __construct(&strVocabulary) {
    &this->strVocabulary = &strVocabulary;
  }

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

这是我在PHP中的第一行,请随时纠正

链接地址: http://www.djcxy.com/p/54867.html

上一篇: Dependencies inside an object

下一篇: Are there any concurrency debugging tools for C#.NET in VS2010